我在 KVO 上出售,但如果以明显的方式使用它是同步的。我想在我快速连续触发许多 KVO 消息的情况下使用它,这导致我的应用程序在处理 KVO 消息时停止运行。有人可以建议一种方法 - 也许使用NSOperation
或NSThread
- 可以在这里工作吗?
我的目标是尽可能保留 KVO 的解耦、灵活性。
我在 KVO 上出售,但如果以明显的方式使用它是同步的。我想在我快速连续触发许多 KVO 消息的情况下使用它,这导致我的应用程序在处理 KVO 消息时停止运行。有人可以建议一种方法 - 也许使用NSOperation
或NSThread
- 可以在这里工作吗?
我的目标是尽可能保留 KVO 的解耦、灵活性。
KVO 本质上是单线程的,因为 KVO 通知将在与更改相同的线程上传递。
当然,UIKit 和 Cocoa 都只希望你在主线程上玩弄 UI 元素。
因此,如果您正在执行异步操作,您很可能会使用线程,如果是这样,则已经存在同步问题,因为您需要从某个线程获取通知到主线程。
这就是关键所在。您可以在将更改通知传递到主线程之前合并更改通知,而不是盲目地转发每个更改通知。
您可以通过多种方式执行此操作。很可能,特定的解决方案对于您的应用程序来说是非常独特的。
就个人而言,我尽量避免细粒度操作的合并和转发。我发现告诉主线程一个特定的对象子图已经改变要简单得多。很有可能,使用户可见更改的绘图代码将需要重绘相关状态,因此相关更改将自动反映。
正如您所推测的那样,关键是要限制通知,这样您就不会拖慢应用程序的响应速度(或破坏设备的电池寿命)。
使用 Apple 推荐的接待员模式https://developer.apple.com/library/ios/documentation/general/conceptual/CocoaEncyclopedia/ReceptionistPattern/ReceptionistPattern.html
查看 NSNotification。这不是一回事,但您可以在后台线程上触发通知(通过一些研究和工作)。您可以保持良好的解耦和即发即弃行为。