美文网首页Swift
[Swift 必备 Tips] LOCK

[Swift 必备 Tips] LOCK

作者: Zakerberg | 来源:发表于2017-09-19 13:57 被阅读8次

转自 原文链接

无并发,不编码。而只要一说到多线程或者并发的代码,我们可能就很难绕开对于锁的讨论。简单来说,为了在不同线程中安全地访问同一个资源,我们需要这些访问顺序进行。Cocoa 和 Objective-C 中加锁的方式有很多,但是其中在日常开发中最常用的应该是@synchronized,这个关键字可以用来修饰一个变量,并为其自动加上和解除互斥锁。这样,可以保证变量在作用范围内不会被其他线程改变。举个例子,如果我们有一个方法接受参数,需要这个方法是线程安全的话,就需要在参数上加锁:

如果没有锁的话,一旦anObj的内容被其他线程修改的话,这个方法的行为很可能就无法预测了。

但是加锁和解锁都是要消耗一定性能的,因此我们不太可能为所有的方法都加上锁。另外其实在一个 app 中可能会涉及到多线程的部分是有限的,我们也没有必要为所有东西加上锁。过多的锁不仅没有意义,而且对于多线程编程来说,可能会产生很多像死锁这样的陷阱,也难以调试。因此在使用多线程时,我们应该尽量将保持简单作为第一要务。

扯远了,我们回到@synchronized上来。虽然这个方法很简单好用,但是很不幸的是在 Swift 中它已经 (或者是暂时) 不存在了。其实@synchronized在幕后做的事情是调用了objc_sync中的objc_sync_enter和objc_sync_exit方法,并且加入了一些异常判断。因此,在 Swift 中,如果我们忽略掉那些异常的话,我们想要 lock 一个变量的话,可以这样写:

更进一步,如果我们喜欢以前的那种形式,甚至可以写一个全局的方法,并接受一个闭包,来将objc_sync_enter和objc_sync_exit封装起来:

再结合 Swift 的尾随闭包的语言特性,这样,使用起来的时候就和 Objective-C 中很像了:

相关文章

  • [Swift 必备 Tips] LOCK

    转自原文链接 无并发,不编码。而只要一说到多线程或者并发的代码,我们可能就很难绕开对于锁的讨论。简单来说,为了在不...

  • Swift struct Mutable 的方法

    @(Swifter - 100 个 Swift 必备 Tips (第二版) 读书笔记)[swift][ios] 1...

  • Swift -tips-- lock

    objC中的@synchronized方法在Swift中做的事情是条用了objc_sync中的objc_sync_...

  • @autoclosure 和 ?? 讲解

    本人摘录来自: 王巍 (onevcat). 《Swifter - 100 个 Swift 必备 Tips (第二版...

  • Swift 正则表达式

    自定义符号正则匹配 摘录来自: 王巍 (onevcat). “Swifter - Swift 必备 Tips (第...

  • 那些有用的tips

    本文本人阅读@onevcat 的 《Swifter - 100 个Swift 必备 tips》后所做笔记,有兴趣可...

  • Swift3 柯里化 (Currying)

    前言:本文是 在 王巍 (onevcat). “Swifter - Swift 必备 Tips (第三版)”。 i...

  • iOS Swift中的Protocol

      最近在看王巍大神的《Swift必备Tips》这本书,发现里面写的Tips都很实用,很值得推荐,是个进阶的不错选...

  • [Swift 必备 Tips] #warning

    许多人喜欢OC中的#warning ,但是Swift中要怎么写呢? TAGS="TODO:|FIXME:"echo...

  • [Swift 必备 Tips] SELECTOR

    转自原文链接 @selector是 Objective-C 时代的一个关键字,它可以将一个方法转换并赋值给一个SE...

网友评论

    本文标题:[Swift 必备 Tips] LOCK

    本文链接:https://www.haomeiwen.com/subject/thvwsxtx.html