Swift单例模式

来源:互联网 发布:网络制造 编辑:程序博客网 时间:2024/06/07 09:17

Swift单例模式

单例模式

单例模式的作用是解决“应用中只有一个实例”的一类问题。在Cocoa Touch框架中,有UIApplication、NSUserDefaults和NSNotificationCenter等单例类。另外,NSFileManager和NSBundle类虽然属于Cocoa框架的内容,但也可以在Cocoa Touch框架中使用(Cocoa框架中的单例类有NSFileManager、NSWorkspace和NSApplication等)。

很多人都熟悉OC的单例创建的方式,使用NSLock、@synchronized等锁,所用GCD的dispatch-once创建等..
但是Swift作为一个新的语言,跟OC的区别还是蛮大的,
那么怎么私用Swift创建一个单例呢?

单例模式的实现有很多方案,苹果公司在《UsingSwift with Cocoa and Objective-C》官方文档中给出了一种单例模式的实现。最简单形式代码如下:

    class Singleton {          static let sharedInstance = Singleton()      }  

是的就是这么简单,上述代码采用static的类属性实现单例模式,这种类属性只被延迟加载执行一次,即便是在多线程情况下也只是执行一次,并且保证是线程安全的。
当然这里使用了全局变量而非类变量,是因为不支持类变量

与类不同,结构可以定义静态变量,通过使用此方法,将静态变量升级为类变量(在支持类变量之前,推荐此方法)

class Singleton {    class var sharedInstance : Singleton {        struct Static {            static let instance : Singleton = Singleton()        }        return Static.instance    }}

如果我们想要有更多的初始化,我么也可以使用闭包的形式创建

    class Singleton {          static let sharedInstance: Singleton = {                let instance = Singleton()                // 初始化处理                return instance              }()      }  

当然很多人会想到dispatch-once,因为OC这样的创建方式已经习惯了,

class Singleton {    class var sharedInstance : Singleton {        struct Static {            static var onceToken : dispatch_once_t = 0            static var instance : Singleton? = nil        }        dispatch_once(&Static.onceToken) {            Static.instance = Singleton()        }        return Static.instance!    }}

但是Swift3.0取消了once的实现,
所以我们只能自己来实现.

extension DispatchQueue {    private static var _onceTracker = [String]()    public class func once(_ token: String, block:()->Void) {        objc_sync_enter(self)        defer { objc_sync_exit(self) }        if _onceTracker.contains(token) {            return        }        _onceTracker.append(token)        block()    }}

那么我们创建的方式一样可以使用once

class Singleton {        class var sharedInstance : Singleton {            struct Static {                static var onceToken = NSUUID().uuidString//可以自定一个值......                static var instance : Singleton? = nil            }            DispatchQueue.once(Static.onceToken) {                Static.instance = Singleton()            }            return Static.instance!        }    }

当然单例模式的创建,我只是列举了几个例子,至于在应用中如何使用,使用哪一个,可以根据需求来定….

欢迎访问我的系列博客
系列:iOS开发-前言+大纲
http://blog.csdn.net/spicyShrimp/article/details/62218521

1 0
原创粉丝点击