我的 iPad 应用程序与 XML 提要同步,在从 NSOperationQueue 执行的 NSOperation 子类中运行同步。当它解析提要时,它会通过 performSelectorOnMainThread:withObject:waitUntilDone:
回调到主线程,以更新 UI 的各个部分、安排下载等。其中一些非常昂贵;随着同步的进行,用户界面有时会停止响应一两秒钟。
为了使 UI 更具响应性,我删除了 performSelectorOnMainThread:withObject:waitUntilDone:
的使用,转而使用直接调用来执行所有与同步相关的任务,包括更新 UI。所以现在同步完全发生在 NSOperationQueue 创建的后台线程上。这似乎工作得很好,并且 UI 在同步期间响应更快。
但是,我对以这种方式发布它持怀疑态度。我在不同的地方看到一些提到应该只更新主线程上的 UI ( example with reference to AppKit )。但我一直无法在文档中找到关于此主题的任何具体信息。
那么在主线程上更新 UI 有多重要呢?应用程序的哪些部分是线程安全的,哪些不是?是否有引用解释在 NSOperation 中执行什么是安全的,什么应该只在 iOS 的主线程上执行?我真的在做不安全或容易发生碰撞的事情吗?
最佳答案
始终在主线程上更新 UI 非常重要。从后台线程访问 UI 可能会导致各种问题,包括内部状态损坏、崩溃或只是简单的不正确行为。任何不需要接触 UI 的工作都应该在后台线程上进行,但更新 UI 的代码肯定需要在主线程上进行。
关于cocoa-touch - 从 NSOperation 使用 `performSelectorOnMainThread:withObject:waitUntilDone:` 有多重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4751499/