[譯]Swift 3 中實現(xiàn)Dispatch once擴展

在3中原有的Dispatch once已經(jīng)被廢棄了。但是可以通過給DispatchQueue實現(xiàn)一個擴展方法來實現(xiàn)原有的功能。
代碼如下:

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,執(zhí)行once的時候加了一個鎖,避免多線程下的token判斷不準(zhǔn)確的問題。
使用的時候可以傳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!" )
}

歡迎關(guān)注我的微博:@沒故事的卓同學(xué)

相關(guān)鏈接:
Dispatch once in Swift 3

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容