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

How to make a function atomic in Swift?

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

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

在所有三种情况下都调用了一个特定的函数B来修改对象A,所以我在想如果我能让这个函数B成为原子的,那么这个问题就解决了。有办法吗?

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

原子属性或其他同步技术仅对并发(多线程)代码有意义。如果没记错的话,Atomic 只针对属性,其他的没有methods/functions。

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