它是确定建立在后台线程一个UIView?(Is it ok to create a UIView o

2019-06-25 15:12发布

我知道的UIView不是线程安全的,所以我不能在后台线程添加视图,来解决,这是它确定以创建一个后台线程一个UIView然后将其添加在主线程?

注:IM的原因在主线程不这样做,是因为我的实际代码是很多更复杂,为此需要一段时间来创建所有的意见和填充值。 我不想当我这样做,所以我尝试解决这个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];
}

提前致谢。

Answer 1:

从UIView的 :

线程注意事项

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

要将呼叫initWithFrame:明确不是线程安全的。 到呼叫setText:很可能不是线程安全的,“操纵”条款下下降。 这些肯定是不答应是线程安全的。

做你的工作,以找出在后台线程中的数据。 然后创建你的主线程的意见。 如果有意见数量庞大,您可以使用多种尝试拆分工作dispatch_async()调用到主队列。 这可能让UI保持响应; 我还没有与它广泛的试验。

您可能还需要考虑在切换UIViewCALayer在可能的情况。 大多数CALayer工作可以在后台线程来完成。 如果你有意见数量庞大,这可能是低效的反正。 如果它只是,它需要很长的时间来计算视图中的数据,这说明你没有正确分离模型和视图的信息。 模型类应该计算需要独立创建视图的一切。



Answer 2:

我使用的Xcode 9.0版本的Beta 3(9M174d),收到警告。

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

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

显示如下图:



Answer 3:

在绘图和打印指南指出:

重要的UIKit类一般不是线程安全的。 所有的绘制相关的操作应该在你的应用程序的主线程中执行。

因此,我理解这一点,似乎唯一的问题是有关“绘图相关的操作”。 如果我们假设一个正确的类仅在执行这样的操作drawRect:方法,那么你建议的方法应该是罚款。



文章来源: Is it ok to create a UIView on a background thread?