[譯]Swift 3 中實現Dispatch once擴充套件

沒故事的卓同學發表於2019-03-04

在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!" )
}複製程式碼

歡迎關注我的微博:@沒故事的卓同學

相關連結:
Dispatch once in Swift 3

相關文章