使用`performSelectorOnMainThread:withObject:waitUntilDone:`来自NSOperation?有多重要?

the*_*ory 4 concurrency cocoa-touch uikit nsoperation ios

我的iPad应用程序与XML提要同步,在NSOperationQueue执行的NSOperation子类中运行同步.当它解析feed时,它会回调主线程performSelectorOnMainThread:withObject:waitUntilDone:来更新UI的各个部分,安排下载等.其中一些非常昂贵; 随着同步的进行,UI有时会在一两秒内无响应.

为了使UI更具响应性,我删除了使用performSelectorOnMainThread:withObject:waitUntilDone:支持直接调用来执行所有与同步相关的任务,包括更新UI.所以现在同步完全发生在NSOperationQueue创建的后台线程上.这似乎工作得很好,并且在同步期间UI更具响应性.

但是,我很抱歉以这种方式发布它.我在各个地方看到过一些人应该只更新主线程上的UI(例如参考AppKit).但我一直无法在文档中找到关于此主题的任何具体内容.

那么更新主线程上的UI有多重要?应用程序的哪些部分是线程安全的,哪些不是?是否有一个参考解释在NSOperation中执行什么是安全的,哪些应该只在iOS的主线程上执行?我真的在做一些不安全或容易崩溃的事情吗?

Lil*_*ard 8

始终更新主线程上的UI非常重要.从后台线程触摸UI可能会导致各种问题,包括内部状态损坏,崩溃或只是简单的错误行为.任何不需要触摸UI的工作都应该在后台线程上进行,但是更新UI的代码位必须在主线程上进行.