在performSelectorInBackground之后调用performSelectorOnMainThread?

时间:2011-08-19 10:18:06

标签: objective-c multithreading cocoa-touch

通常在新线程结束时调用主线程将结果应用到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;
}

由于

1 个答案:

答案 0 :(得分:3)

  

我们不能从'分离'线程中应用我们的结果吗?

不,UI不能从主线程以外更新。一般来说,UIKit is not thread-safe.

  

在大多数情况下,UIKit类只能用于   应用程序的主要线程。对于课程尤其如此   源自UIResponder或涉及操纵你的   应用程序的用户界面。

这就是为什么在后台执行长时间运行的任务然后调用performSelectorOnMainThread来更新UI的常见做法。

虽然beginning with iOS 4.0,但在UIKit中绘制图形上下文是线程安全的。具体来说,访问和操作当前图形堆栈,绘制图像和字符串,以及从辅助线程使用颜色和字体对象。