2012-08-28 51 views
4

我知道UI只应该在主线程上更新,但是可以在单独的线程上创建和添加子视图,只要它们没有添加到可见视图中?会造成内存和性能问题吗?这是一些示例代码。在后台线程上构建UIViews

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
[queue addOperationWithBlock:^{ 
    // do some fancy calculations, building views 
    UIView *aView = .. 
    for (int i, i<1000, i++) 
    { 
     UIView *subView = … 
     [aView addSubview:subView]; 
    } 

    // Update UI on Main Thread 
    [queue addOperationWithBlock:^{ 
     [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 

      // Update the interface 
      [self.view addSubview:aView]; 
     }]; 
    }]; 
}]; 
+2

您应该查看2012年WWDC视频“在iOS上构建并发用户界面”。 –

回答

3

我的,为什么你不希望这样做的理解是,CALayer备份BYY不是线程安全的内存。所以你可以绘制后台线程,但不能渲染图层或操作视图。

因此,您所做的是将复杂的视图逻辑绘制到图像上下文中,并将图像传递到主线程以显示在图像视图中。

希望这会有所帮助!

+0

所以我可以在不添加可视视图的情况下创建UIViews,甚至可以将子视图添加到这些视图中(可能在创建后将它们添加到数组中),然后逐步添加到可见视图中?谢谢 – cannyboy

+1

我其实不知道这是否明确禁止。但我想我的问题是为什么?如果绘图是您的瓶颈,即使您能够在后台线程上构建视图层次结构,它仍然会在主线程上绘制,并将其添加到可见层次结构中。如果为了创建视图而进行的一些计算是瓶颈,那么在后台执行这些计算并将结果传递给主线程并在那里构建视图层次结构。 –

2

辅助线程上的UI更改将导致应用程序崩溃。所以总是在主线程上进行UI更改。

[self performSelectorOnMainThread:@selector(makeUIChanges:) withObject:nil waitUntilDone:YES];