在后台线程上创build一个视图,在主线程中添加主视图

我是新来的目标C,来自.NET和Java的背景。

所以我需要创build一些UIwebviewsasynchronous,我正在使用我自己的队列

dispatch_queue_t queue = dispatch_queue_create("myqueue", NULL); dispatch_async(queue, ^{ // create UIwebview, other things too [self.view addSubview:webView]; }); 

正如你所想象的那样会抛出一个错误:

  bool _WebTryThreadLock(bool), 0xa1b8d70: Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now... 

那么我怎样才能在主线上添加子视图呢?

由于您已经在使用派遣队列。 我不会使用performSelectorOnMainThread:withObject:waitUntilDone:而是在主队列上执行子视图添加。

 dispatch_queue_t queue = dispatch_queue_create("myqueue", NULL); dispatch_async(queue, ^{ // create UIwebview, other things too // Perform on main thread/queue dispatch_async(dispatch_get_main_queue(), ^{ [self.view addSubview:webView]; }); }); 

在后台队列上实例化UIWebView是很好的。 但要将其作为子视图添加,您必须位于主线程/队列中。 从UIView文档:

线程考虑

对应用程序用户界面的操作必须在主线程上进行。 因此,你应该总是从应用程序主线程中运行的代码调用UIView类的方法。 唯一可能不是严格需要的是创build视图对象本身,但所有其他操作应该在主线程上进行。

大多数UIKit对象,包括UIView实例, 只能从主线程/队列中操作。 您不能将消息发送到任何其他线程或队列上的UIView 。 这也意味着你不能在任何其他线程或队列上创build它们。

正如rob说UI改变只应在主线程上完成。你正在尝试从辅助线程添加。改变你的代码[self.view addSubview:webView]; self.view [self.view addSubview:webView];

[self.view performSelectorOnMainThread:@selector(addSubview:) withObject:webView waitUntilDone:YES];