在后台线程上构建UIViews

时间:2012-08-28 11:20:45

标签: iphone ios uiview nsoperationqueue

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

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 个答案:

答案 0 :(得分:3)

我对你不想这样做的理解是CALayer由非线程安全的内存支持。因此,您可以在后台线程上绘图,但不能渲染图层或操纵视图。

所以你要做的是将复杂的视图逻辑绘制到图像上下文中,然后将图像传递给主线程,以便在图像视图中显示。

希望这有帮助!

答案 1 :(得分:2)

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

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