2012-12-11 131 views
6

我遇到了一個奇怪的問題,NSFRC的fetchedObjects數組並沒有返回它應該的所有對象。爲了給你一些上下文,我的應用程序有幾個列表視圖控制器,每個控制器都有一個NSFRC。我正在更新委託方法controllerDidChangeContent內的列表視圖。我面臨的問題如下:在將對象存儲在後臺MOC中並保存後,將調用controllerDidChangeContent,但我剛保存在後臺線程中的對象不會顯示在NSFRC中。這裏是一段代碼,我使用檢查此:NSFetchedResultsController缺少一些對象

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    NSManagedObjectContext *context = controller.managedObjectContext; 
    NSError *error = nil; 
    NSArray *array = [context executeFetchRequest:controller.fetchRequest error:&error]; 
    if (nil != array) { 
     NSUInteger count = MIN(controller.fetchedObjects.count, array.count); 
     for (NSUInteger index=0; index<count; index++) { 
      NSManagedObject *a = array[index]; 
      NSManagedObject *b = controller.fetchedObjects[index]; 
      // Here you will see that sometimes the objects don't match 
      NSLog(@"%d: %@ <--> %@", index, [[a body] text], [[b body] text]); 
     } 
    } 
} 

我期待的NSFRC fetchedObjects陣列是相同的,以通過手動executeFetchRequest返回的數組(我使用的NSFRC fetchRequest到手動獲取數據)。然而,這種情況並非如此。手動executeFetchRequest比NSFRC fetchedObjects返回更多的對象。有誰知道發生了什麼事?我已經關閉了NSFRC上的緩存,但報告了相同的行爲。

謝謝!

===更新====

關於該問題的一些更新。我認爲Core Data中存在一個錯誤,因爲我能夠看到NSFRC的一些不一致的結果,而且能夠通過涉及「觸及」相關對象的解決方法來解決問題。以下是解釋發生的情況:

想象下面的核心數據模型,其中: - 有Cat對象和Master對象。 - 一隻貓可以擁有一個或多個主人。 - 主人可以擁有一個或多個貓。 - 創建第一個NSFRC(我們稱之爲NSFRC_A),以獲取名爲「Master_A」的所有貓。謂詞是{任何master.name ==「Master_A」}。 - 創建第二個NSFRC(我們稱之爲NSFRC_B),以獲取名爲「Master_B」的主人的所有貓。謂詞是{任何master.name ==「Master_B」}。 - 僅在UI線程中使用主要託管對象上下文 - 爲每個後臺線程創建後臺託管對象上下文,使用與主要託管對象上下文相同的持久性存儲。

在後臺創建名爲「Cat_A」的貓,並將其分配給主人「Master_A」。在保存背景上下文之後,主要上下文被適當地更新。此時,NSFRC_A通知其代表已發生更改並正確報告「Cat_A」。

後來,在後臺線程中,同一個cat「Cat_A」被分配了主「Master_B」。在保存背景上下文之後,主要上下文被適當地更新。此時,NSFRC_A通知其代表該變更並正確報告「Cat_A」。 NSFRC_B還通知其代表該更改但不報告「Cat_A」(它從fetchedObjects中缺失)。但是,如果我使用與NSFRC_B相同的fetchRequest手動執行提取,則可以看到「Cat_A」被返回。奇怪的是,返回的「Cat_A」實例被標記爲故障,這解釋了爲什麼NSFRC_B不返回「Cat_A」,因爲它在內存中沒有看到它。

這是一個錯誤,因爲我可以通過簡單地將來自後臺線程的更改合併到主上下文中時將「Cat_A」關係記錄到主服務器來修復該行爲:日誌記錄基本上觸及對象並強制它實現進入記憶。

+0

+1對於非Xcode問題未標記爲Xcode。 :) – Almo

+0

當然,您已經仔細檢查過沒有人對相關請求隱藏提取限制嗎? – Tommy

+1

你怎麼知道計數是不同的。上面的邏輯只是說明這些值是不同的,但這很好,因爲返回的對象是一個數組,順序會有所不同。在一個數組中,你可以得到a,b,c,d,而在另一個數組中,你可以得到d,a,c,b。你是否檢查計數是否也不同,因爲你只是循環遍歷兩者的最小值。 – Srikanth

回答

1

該問題似乎是NSFRC的限制。根據蘋果論壇上的這個線程(https://devforums.apple。com/message/765374):「限制是實體A的獲取結果控制器不會總是捕獲會導致謂詞改變的實體B的更新。」爲了解決這個問題,我必須在它被合併到主線程之前弄髒我要查找的對象:然後NSFRC檢測到這個改變。