验证中...
开源中国 2018 年度最后一场技术盛会邀你来约~错过就要等明年啦!点此立即预约
语言: Swift
分类: iOS 组件
最后更新于 2018-08-28 15:29
gistfile1.txt
原始数据 复制代码
//无并发,不编码。 而只要一说到多线程或者并发的代码,我们就很难绕开关于锁的讨论。
//简单来说,为了在不同线程中安全的访问同一个资源,我们需要这些访问顺序的进行。
//Cocoa和Objective-C中加锁的方式有很多,但是其中在日常开发中最常用的应该是@synchronized
//@synchronized这个关键字可以用来修饰一个变量,并为其自动加上和解除“互斥锁”。这样可以保证变量在作用范围内不会被其他线程改变。
- (void)myMethod:(id)anObject {
@synchronized(anObject) {
//在括号内持有anObj锁
}
}
//但是很不幸,在Swift中它已经不存在了。
//其实@synchronized在幕后做的事情是调用了objc_sync中的objc_sync_enter和objc_sync_exit方法,并且做了一些异常判断。
//因为在Swift中如果忽略掉那些异常的话,我们想要lock一个变量的话,可以这样写:
func myMethod(anObj:AnyObject!) {
objc_sync_enter(anObj)
//在enter 和 exit之间持有anObj锁
objc_sync_exit(anObj)
}
//更进一步,如果我们喜欢以前的那种方式,甚至可以写一个全局的方法,并接受一个闭包,来将objc_syn_enter和objc_syn_exit封装起来
func synchronized(_ lock:AnyObject, closure:()->()) {
objc_sync_enter(lock)
closure()
objc_sync_exit(lock)
}
//再结合Swift的尾随闭包的特性,这样,使用起来的时候和Objective-C中很像了:
func myMethod(anObj:AnyObject!) {
synchronized(anObj) {
//在括号内持有anObj锁
}
}

评论列表( 0 )

你可以在登录后,发表评论

搜索帮助

12_float_left_people 12_float_left_close