Swift單例模式
單例模式
單例模式的作用是解決“應(yīng)用中只有一個實例”的一類問題。在Cocoa Touch框架中果复,有UIApplication陈莽、NSUserDefaults和NSNotificationCenter等單例類。另外,NSFileManager和NSBundle類雖然屬于Cocoa框架的內(nèi)容传透,但也可以在Cocoa Touch框架中使用(Cocoa框架中的單例類有NSFileManager耘沼、NSWorkspace和NSApplication等)。
很多人都熟悉OC的單例創(chuàng)建的方式,使用NSLock朱盐、@synchronized等鎖群嗤,所用GCD的dispatch-once創(chuàng)建等..
但是Swift作為一個新的語言,跟OC的區(qū)別還是蠻大的兵琳,
那么怎么私用Swift創(chuàng)建一個單例呢狂秘?
單例模式的實現(xiàn)有很多方案,蘋果公司在《UsingSwift with Cocoa and Objective-C》官方文檔中給出了一種單例模式的實現(xiàn)躯肌。最簡單形式代碼如下:
class Singleton {
static let sharedInstance = Singleton()
}
是的就是這么簡單,上述代碼采用static的類屬性實現(xiàn)單例模式者春,這種類屬性只被延遲加載執(zhí)行一次,即便是在多線程情況下也只是執(zhí)行一次清女,并且保證是線程安全的钱烟。
當(dāng)然這里使用了全局變量而非類變量,是因為不支持類變量
與類不同嫡丙,結(jié)構(gòu)可以定義靜態(tài)變量拴袭,通過使用此方法,將靜態(tài)變量升級為類變量(在支持類變量之前曙博,推薦此方法)
class Singleton {
class var sharedInstance : Singleton {
struct Static {
static let instance : Singleton = Singleton()
}
return Static.instance
}
}
如果我們想要有更多的初始化,我么也可以使用閉包的形式創(chuàng)建
class Singleton {
static let sharedInstance: Singleton = {
let instance = Singleton()
// 初始化處理
return instance
}()
}
當(dāng)然很多人會想到dispatch-once,因為OC這樣的創(chuàng)建方式已經(jīng)習(xí)慣了,
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的實現(xiàn),
所以我們只能自己來實現(xiàn).
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()
}
}
那么我們創(chuàng)建的方式一樣可以使用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!
}
}
當(dāng)然單例模式的創(chuàng)建,我只是列舉了幾個例子,至于在應(yīng)用中如何使用,使用哪一個,可以根據(jù)需求來定....