cocoa-touch - 从 NSOperation 使用 `performSelectorOnMainThread:withObject:waitUntilDone:` 有多重要?

标签 cocoa-touch ios concurrency uikit nsoperation

我的 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/

相关文章:

objective-c - UISlider仅滑动一小段距离

objective-c - 发布 UIAlertView 时的奇怪编码模式

iphone - 核心数据多对多关系-谓词问题

ios - 在 iOS7 上拍照时,有没有办法使用代码让它不水平翻转?

ios - 是否可以从放置在设备中任何位置的iphone应用程序浏览文件?

node.js - 如何测试nodejs并发请求

swift - 根据 Xcode 目标进行导航

ios - 设置对象或调用函数 EXC_BAD_ACCESS 时出错(代码=257)

java - 只访问一次 ConcurrentHashMap<Element, Boolean> 的每个元素的可扩展方式

concurrency - 这个webapp代码需要同步吗?