2012-08-28 94 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];