通常在新线程结束时调用主线程将结果应用到UI?我们不能从'分离'线程中应用我们的结果吗?例如,在示例代码ListAdder中,我们使用:
[self performSelectorInBackground:@selector(threadRecalculateNumbers:) withObject:immutableNumbers];
在函数中我们回到主线程:
[self performSelectorOnMainThread:@selector(threadRecalculateDone:) withObject:totalStr waitUntilDone:NO];
和功能:
- (void)threadRecalculateDone:(NSString *)result
{
// The user interface is adjusted by a KVO observer on recalculating.
self.formattedTotal = result;
self.recalculating = NO;
}
由于
保
答案 0 :(得分:3)
我们不能从'分离'线程中应用我们的结果吗?
不,UI不能从主线程以外更新。一般来说,UIKit is not thread-safe.
在大多数情况下,UIKit类只能用于 应用程序的主要线程。对于课程尤其如此 源自UIResponder或涉及操纵你的 应用程序的用户界面。
这就是为什么在后台执行长时间运行的任务然后调用performSelectorOnMainThread
来更新UI的常见做法。
虽然beginning with iOS 4.0,但在UIKit中绘制图形上下文是线程安全的。具体来说,访问和操作当前图形堆栈,绘制图像和字符串,以及从辅助线程使用颜色和字体对象。