我知道的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];
}
提前致谢。
从UIView的 :
线程注意事项
操作您的应用程序的用户界面必须在主线程上发生。 因此,你应该始终调用UIView类从代码中应用程序的主线程运行的方法。 这可能不是绝对必要的唯一的一次是在创建视图对象本身时,但所有其他的操作应在主线程上发生。
要将呼叫initWithFrame:
明确不是线程安全的。 到呼叫setText:
很可能不是线程安全的,“操纵”条款下下降。 这些肯定是不答应是线程安全的。
做你的工作,以找出在后台线程中的数据。 然后创建你的主线程的意见。 如果有意见数量庞大,您可以使用多种尝试拆分工作dispatch_async()
调用到主队列。 这可能让UI保持响应; 我还没有与它广泛的试验。
您可能还需要考虑在切换UIView
到CALayer
在可能的情况。 大多数CALayer
工作可以在后台线程来完成。 如果你有意见数量庞大,这可能是低效的反正。 如果它只是,它需要很长的时间来计算视图中的数据,这说明你没有正确分离模型和视图的信息。 模型类应该计算需要独立创建视图的一切。
我使用的Xcode 9.0版本的Beta 3(9M174d),收到警告。
[UView的init]必须从主线程调用只
所以,我认为你应该更好地创造在主线程UI
显示如下图:
在绘图和打印指南指出:
重要的UIKit类一般不是线程安全的。 所有的绘制相关的操作应该在你的应用程序的主线程中执行。
因此,我理解这一点,似乎唯一的问题是有关“绘图相关的操作”。 如果我们假设一个正确的类仅在执行这样的操作drawRect:
方法,那么你建议的方法应该是罚款。