我setNeedsDisplay
在一个新线程中调用该方法,但在我的视图中没有看到任何变化。setNeedsDisplay
调用新线程后,我应该怎么做才能看到我的所有更改?
问问题
1446 次
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 回答