Objective-C 中的 @synchronized 大家都应该很熟悉,用来对一段代码块加锁。不过在 Swift 中没有提供对应的关键字执行相同的操作。所以如果要使用类似的 synchronized,则需要自己动手。

以下是 RxSwift 中的实现方式:

extension Reactive where Base: AnyObject {
    func synchronized<T>(_ action: () -> T) -> T {
        objc_sync_enter(self.base)
        let result = action()
        objc_sync_exit(self.base)
        return result
    }
}

可以看到是通过 objc_sync_enterobjc_sync_exit 来对代码块加锁。而实际上 Objective-C 中的 @synchronized 也是基于这两个函数来实现的。如果有兴趣,可以查看一下源代码

参考链接