可以在后台线程上创build一个UIView吗?

我知道UIView不是线程安全的,所以我不能添加一个后台线程的视图,解决这个问题是可以在后台线程上创build一个UIView然后将其添加到主线程?

注意:在主线程中不这样做的原因是因为我的实际代码复杂得多,因此需要一段时间才能创build所有视图并填充值。 当我这样做时,我不希望UI变得不响应,所以即时通讯尝试解决这个问题。

例如..

-(void)addLabel//called on background thread { UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(0,0,40,100)]; [label setText:@"example"] [self.view performSelector:@selector(addSubview:) onThread:[NSThread mainThread] withObject:example waitUntilDone:YES]; } 

提前致谢。

从UIView :

线程考虑

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

调用initWithFrame:显式不是线程安全的。 调用setText:可能不是线程安全的,属于“操作”子句。 这些肯定不是线程安全的。

做你的工作,找出后台线程上的数据。 然后在主线上创build你的观点。 如果有大量的视图,您可以尝试使用几个dispatch_async()调用将工作分解到主队列上。 这可能会让UI保持响应; 我没有广泛的尝试。

如果可能的话,你也可以考虑从UIView切换到CALayer 。 大多数CALayer工作可以在后台线程上完成。 如果你有大量的意见,这可能是无效的。 如果这只是需要很长时间来计算视图的数据,这表明你没有正确分离模型和视图信息。 Model类应该计算独立于创build视图所需的所有内容。

我使用Xcode版本9.0 beta 3(9M174d),接收警告。

[UView init]只能从主线程调用

所以我认为你应该更好地在主线程中创buildUI

显示下面的图片:

在这里输入图像说明

绘图和打印指南指出:

重要UIKit类通常不是线程安全的。 所有与绘图有关的操作应该在应用程序的主线程上执行。

因此,据我了解,似乎唯一的问题是与“绘图相关的操作”有关。 如果我们假设一个正确的类只在它的drawRect:方法中执行这样的操作,那么你build议的方法应该没问题。