如何在Swift中使函数成为原子?

时间:2016-02-19 02:16:36

标签: ios swift asynchronous synchronization interrupt

我目前正在Swift中编写一个iOS应用程序,我遇到了以下问题:我有一个对象A.问题是虽然应用程序只有一个线程(我没有创建单独的线程),当对象A被修改时 1)某个NSTimer()触发器 2)某个observeValueForKeyPath()触发
3)来自Parse触发器的某个回调。

据我所知,以上三种情况都像软件中断一样。因此,当代码运行时,如果发生来自Parse的NSTimer()/ observeValueForKeyPath()/回调,则当前代码被中断并跳转到相应的代码。这不是竞争条件(因为只有一个线程),我不认为这样的https://gist.github.com/Kaelten/7914a8128eca45f081b3可以解决这个问题。

在所有三种情况下都有一个特定的函数B来修改对象A,所以我在想如果我能使这个函数B原子化,那么这个问题就解决了。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

你做了一些不正确的假设。你提到的所有事情都不会打断处理器。 1和2都同步运行。在您的代码完成并且您的应用程序为事件循环提供服务之前,计时器不会触发或者观察到V.ValueForKeyPath。

原子属性或其他同步技术仅对并发(多线程)代码有意义。如果内存服务,Atomic仅用于属性,而不用于其他方法/功能。

我相信Parse使用在后台线程上运行的完成块,在这种情况下,你的#3 **是*使用单独的线程,即使你没有意识到你正在这样做。这是您需要担心同步的唯一情况。在这种情况下,最简单的方法是简单地将完成块代码括在dispatch_async(dispatch_get_main_queue())的调用中,这使得dispatch_async闭包中的所有代码都在main上运行,从而完全避免了并发问题。