簡體   English   中英

從后台線程和主線程同時訪問核心數據時,應用崩潰

[英]App crashing when core data acessed from background thread and main thread at the same time

我的情況是我的應用使用了核心數據,並且需要從該核心數據中加載圖片以顯示在表格視圖中。 由於這樣做需要時間,因此需要在后台線程中運行。 所以我有這樣的代碼:

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];
    });

});

這大大加快了處理速度,准備就緒后,圖像就會顯示在背景中。

問題是,有時它會與前台線程同時嘗試前台線程並訪問核心數據。 它不喜歡這樣,因此崩潰。 這一定是許多開發人員都參與其中的一種情況,因此有一種解決方案。 我想知道如何處理這種情況,以便當我的應用程序都同時開始訪問核心數據時,我的應用程序不再崩潰?

在這里查看我以前的答案

對於核心數據,有一個黃金法則-每個線程一個托管對象上下文。 受管對象上下文不是線程安全的,因此,如果您在后台任務中進行工作,則可以使用主線程來避免線程與UI操作發生沖突,或者您可以創建一個新的上下文來進行工作。幾秒鍾,那么您應該執行后者以阻止UI鎖定。

簡而言之,您需要創建一個單獨的托管對象上下文以在后台線程中使用。 然后,您必須在適當的地方將更改合並回原始上下文。

您需要閱讀Apple的Core Data編程指南。

基本上,NSManagedObjects和NSManagedObjectContexts不是線程安全的。 您將需要在背景上下文上創建一個新的NSManagedObjectContext來完成工作。 您不能跨線程傳遞NSManagedObjects。 相反,您可以存儲一個NSManagedObjectID數組,並使用該數組從新上下文“重新加載”對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM