-4

setNeedsDisplay在一个新线程中调用该方法,但在我的视图中没有看到任何变化。setNeedsDisplay调用新线程后,我应该怎么做才能看到我的所有更改?

4

2 回答 2

7

您不能在后台线程上更新用户界面。在您的后台线程中,更改

[object setNeedsDisplay];

[object performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:NO];
于 2014-05-10T16:49:11.810 回答
1

任何涉及 UI 的更新都必须在主线程上进行。一般后台线程用于时间密集型任务,比如下载文件、解析数据等...

您的主线程负责更新用户界面并响应用户事件和操作。这就是我们有后台线程的主要原因,通过保持主线程尽可能空闲来响应用户来管理内存使用和提高性能,而通常会阻塞主线程的时间密集型任务发生在背景。

在后台线程上处理完所有必要的数据和信息后,您必须根据数据提交对 UI 的任何更改,方法是将其分派到主线程:

dispatch_async(dispatch_get_main_queue(), ^{
    //do UI stuff
});

另一种分派到主线程的方式如下:

[self performSelectorOnMainThread:@selector(doUIStuff:) withObject:stuff waitUntilDone:NO];
于 2014-05-10T17:20:26.867 回答