2013-05-16 70 views
0

我需要從後臺線程改變一些實體的,所以我下面dispatch_async:CoreData和使用對象從主managedObjectContext

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    NSManagedObjectContext *parent = [Default managedObjectContext]; 
    NSManagedObjectContext *editContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:parent.concurrencyType]; 
    [editContext setPersistentStoreCoordinator:[Default persistentStoreCoordinator]]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(saveChanges:) 
               name:NSManagedObjectContextDidSaveNotification 
               object:editContext]; 

    NSFetchRequest *request = [NSFetchRequest new]; 
    ... 
    NSArray *fetchedObjects = [context executeFetchRequest:request error:nil]; 

    NSError *error; 
    [editContext save:&error] 
}); 

這是工作,但有時它停止工作,只是從功能退出executeFetchRequest:請求。它發生在模擬器上。 那麼它是從後臺線程更改數據的正確方法?

回答

1

是的,您可以將數據從後臺線程更改爲核心數據,但作爲一條黃金法則「每個線程都應該有自己的NSManagedObjectContext實例」,並使用相同的persistentStoreCoordinator,因爲這樣可以避免數據庫死鎖,其他討厭的問題。

但是我在代碼中看到了一些問題,我不知道是編輯錯誤還是真實錯誤。

  1. context您沒有使用您正在使用的獲取請求。
  2. 在執行save之後,您應該刪除saveChanges觀察者。 (您不希望被其他更改通知)
  3. 在塊中使用self是一種糟糕的做法(這裏不是您的情況),因爲它可能導致保留循環。您應該使用__block YoirClass *blocksafeSelf = self;

而且很難知道什麼可能是這裏的問題沒有一個錯誤,所以你應該在錯誤的參數傳遞給fetchRequest並檢查是否存在錯誤或沒有。

還要確保它真的退出函數,因爲在死鎖的情況下,它看起來像是退出,但實際上它只是停在線上等待。

+0

感謝您的意見,它可以幫助我很多 –

+0

很高興能幫到您;) – danypata

相關問題