1. 程式人生 > >swift--Swift 3.0實戰:實現Dispatch once擴充套件

swift--Swift 3.0實戰:實現Dispatch once擴充套件

在3中原有的Dispatch once已經被廢棄了。但是可以通過給DispatchQueue實現一個擴充套件方法來實現原有的功能。 程式碼如下:

public extension DispatchQueue {

    private static var _onceTracker = [String]()

    /**
     Executes a block of code, associated with a unique token, only once.  The code is thread safe and will
     only execute the code once even in the presence of multithreaded calls.

     - parameter token: A unique reverse DNS style name such as com.vectorform.<name> or a GUID
     - parameter block: Block to execute once
     */
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() } }

使用字串token作為once的ID,執行once的時候加了一個鎖,避免多執行緒下的token判斷不準確的問題。 使用的時候可以傳token

DispatchQueue.once(token: "com.vectorform.test") {
    print( "Do This Once!" )
}

或者使用UUID也可以:

private let _onceToken = NSUUID().uuidString

DispatchQueue.once(token: _onceToken) {
    print( "Do This Once!" )
}

原文地址:http://gold.xitu.io/post/57f85ced7db2a20059432c6d?ref=myread