可以在后台线程上创建UIView吗?

Jas*_*art 17 objective-c uiviewcontroller uiview nsthread ios

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

注意:我不在主线程上执行此操作的原因是因为我的实际代码要复杂得多,因此需要一段时间来创建所有视图并填充值.当我这样做时,我不希望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];
}
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Rob*_*ier 18

来自UIView:

线程注意事项

必须在主线程上对应用程序的用户界面进行操作.因此,您应该始终从应用程序主线程中运行的代码调用UIView类的方法.这可能不是绝对必要的唯一时间是创建视图对象本身但所有其他操作应该在主线程上发生.

调用initWithFrame:显然不是线程安全的.调用setText:可能不是线程安全的,属于"操纵"条款.这些当然不承诺是线程安全的.

做你的工作来弄清楚后台线程上的数据.然后在主线程上创建您的视图.如果有大量视图,您可以尝试使用多个dispatch_async()调用将工作分成主队列.这可能会让UI保持响应; 我还没有对它进行过广泛的实验.

您可能还想考虑切换UIViewCALayer可能的地方.大多数CALayer工作都可以在后台线程上完成.如果你有大量的观点,那么无论如何这可能都是低效的.如果仅仅需要花费很长时间来计算视图的数据,则表明您没有正确地分离模型和视图信息.Model类应该独立于创建Views来计算所需的一切.

  • 对不起,你能澄清一下你的答案吗?来自苹果的引言明确表示在后台创建一个视图是可以的,但你说它不是.为什么? (6认同)

小智 6

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

[UView init]必须仅从主线程调用

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

如下图所示:

在此输入图像描述