我想獲得以下工作。UIManagedDocument與NSFetchedResultsController和背景上下文
我有一個表格視圖顯示從表格視圖中的API獲取的數據。爲了這個目的,我使用一個NSFetchedResultsController:
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:self.database.managedObjectContext
sectionNameKeyPath:nil
cacheName:nil];
我在這樣的背景環境中創建我的實體:
NSManagedObjectContext *backgroundContext;
backgroundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
backgroundContext.parentContext = document.managedObjectContext;
[backgroundContext performBlock:^{
[MyAPI createEntitiesInContext:backgroundContext];
NSError *error = nil;
[backgroundContext save:&error];
if (error) NSLog(@"error: %@",error.localizedDescription);
[document.managedObjectContext performBlock:^{
[document updateChangeCount:UIDocumentChangeDone];
[document.managedObjectContext save:nil];
}];
現在,每當我得到新的數據(和插入/更新實體,如所示只上面),我的NSFetchedResultsController不像它應該那樣工作。特別是,我總是更新一個實體(而不是創建一個新實體),但我的表視圖顯示了兩個實體。一旦我重新啓動應用程序,它顯示正確。
如果我在self.database.managedObjectContext中執行實體的創建([MyAPI createEntities]),一切正常。
任何想法我做錯了什麼?仔細觀察SO上的現有線索,我認爲我正在以正確的方式進行。再次,如果我不做核心數據保存在後臺上下文(但在document.managedObjectContext),那麼它工作正常...
嗯,我認爲不同上下文中的更改將被合併,所以fetchedResultsController將最終得到通知。無論如何,我試着在backgroundContext保存後調用[self.fetchedResultsController performFetch:nil],但仍然是相同的情況:我的表視圖顯示兩個實體,當只有一個實體時。重新啓動應用程序後,它工作正常。 – user1013725 2012-07-05 20:44:29
還記得我有一個UIDocument,也許這改變了事情?我基本上想在後臺線程中將新實體保存/更新到我的文檔中。如果我在UIDocument的managedObjectContext上執行保存,則UI滯後。這就是爲什麼我試着用backgroundContext來做這件事,但不知何故,事情會變得混亂/不合並/不知道發生了什麼。我現在變得非常絕望。 – user1013725 2012-07-05 20:59:39
不幸的是,你的代碼仍然不適合我。它給了我完全奇怪和不可預知的結果。什麼樣的工作對我來說是使用後臺上下文,然後調用保存並獲得該後臺上下文的永久ID。但是,如果更新代碼被同時調用兩次,我現在遇到了競爭條件問題,我認爲這是因爲它在兩個不同的上下文中創建實體,然後合併它們。不知道如何防止這種情況。 – user1013725 2012-07-11 06:28:39