Swift 中实现 synchronized
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_enter
和 objc_sync_exit
来对代码块加锁。而实际上 Objective-C 中的 @synchronized
也是基于这两个函数来实现的。如果有兴趣,可以查看一下源代码