setNeedsDisplay不适用于后台线程

时间:2014-05-10 16:00:46

标签: ios objective-c multithreading setneedsdisplay

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

2 个答案:

答案 0 :(得分:7)

您无法在后台线程上更新用户界面。在后台主题中,更改

[object setNeedsDisplay];

[object performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:NO];

答案 1 :(得分:1)

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

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

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

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

调度主线程的另一种方法如下:

[self performSelectorOnMainThread:@selector(doUIStuff:) withObject:stuff waitUntilDone:NO];