Swift 3에서 Dispatch once 확장

1302 단어
3중원에 있는 디스패치 온스는 이미 폐기됐다.그러나 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. 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이 정확하게 판단하지 못하는 문제를 피합니다.사용할 때 토큰을 전달할 수 있어요.
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

좋은 웹페이지 즐겨찾기