2012-05-30 47 views
1

我的情況是,我的應用程序使用的核心數據,並且需要從核心數據加載圖像在一個表視圖來顯示acessed核心數據崩潰。由於需要這麼做的時間,它需要在後臺線程中運行。所以我有這樣的代碼:應用程序時,從後臺線程和主線程在同一時間

dispatch_async(queue, ^{ 

    if (self.cellInfo.numberOfMediaItems > 0) { 

     int i = 0; 

     int numberOfThumbnails = MIN(self.cellInfo.numberOfMediaItems, 3); 

     while (i < numberOfThumbnails) { 
      Media *media = [self.entry.media objectAtIndex:i]; 

      UIImage *image = [media getThumbnail]; 
      [self.mediaArray addObject:image]; 
      i++; 
     } 
    } 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.isFinishedProcessing = YES; 

     [self setNeedsDisplay]; 
    }); 

}); 

這加快了相當程度的進程,並在圖像準備就緒時出現在背景中。

的問題是,有時它會在同一時間後臺線程有前臺線程嘗試和訪問核心數據。它不喜歡這樣,所以它崩潰。這必然是很多開發人員進入的情況,因此有一個解決方案。我想知道如何處理這種情況,以便我們的應用在同時開始訪問核心數據時停止崩潰?

回答

6

See my previous answer here

當涉及到核心數據 - 一個管理對象 上下文每個線程。因此,如果 你正在做一個後臺任務的工作,你管理的對象上下文不是線程安全或者使用主線程 避免與UI操作線程衝突,或創建一個新的 方面做的工作,如果工作需要幾秒鐘 那麼你應該做後者來阻止你的用戶界面鎖定。

總之,您需要創建一個單獨的託管對象上下文以供您的後臺線程使用。然後,必須在適當的情況下將更改合併回原始上下文。

1

您需要閱讀蘋果公司的核心數據編程指南。

基本上NSManagedObjects和NSManagedObjectContexts不是線程安全的。你將需要在你的後臺上下文中創建一個新的NSManagedObjectContext來完成這項工作。您不能跨線程傳遞NSManagedObjects。相反,你可以存儲一個NSManagedObjectID數組,並用它來從新的上下文中「重新加載」對象。

+1

這意味着我的應用在使用時不會再崩潰? – Andrew

相關問題