8

不知道這是Magical Record保存方式的問題,還是我只是在某處出現noob錯誤。我用NSFetchedResultController(FRC)和UITableView來顯示實體列表,當用戶點擊「添加」一個新的視圖控制器與編輯器被推動,一個新的實體創建與[MyEntity MR_createEntity]。用戶可以在這裏添加通過關係添加到主實體的其他實體。當用戶點擊「保存」在這個視圖控制器上下文保存使用[[NSManagedObjectContext MR_contextForCurrentThread] MR_save]魔法記錄,保存和NSFetchedResultsController

NSFetchedResultsController似乎更新,但是當我點擊編輯實體沒有任何子實體在那裏。調試似乎表明,即使實體已被保存,FRC仍然具有實體及其臨時ID。

我正在做一個天真的[self.tableView reloadData]在FRC controllerDidChangeContent委託方法。

重新啓動應用程序將加載正確的實體,並且子實體在編輯器視圖控制器中正確顯示。

它看起來像FRC響應「主線程」保存事件,但保存實際上發生在後臺線程,所以FRC不會看到它。我已經檢查過,所有「我的」操作(設置FRC,創建和獲取實體)都發生在主線程上下文中。

我試着在MR_rootSavingContext上監聽更改通知,並將它們與主線程上下文合併,這種工作方式有效,但我最終在FRC中出現了重複行(一個是正確的「永久」實體,一個是臨時實體)。

回答

8

好的,我不確定這是否是「正確的方式」,但我發現它工作正常,如果我在MR_rootSavingContext中創建了我的NSFetchedResultsController而不是使用「inContext」版本的默認上下文的MR_fetchAllSortedBy

我想這是有道理的,FRC現在正在觀看rootSavingContext而不是它的一個子節點。儘管如此,我還是會想,因爲我正在同一個線程上進行所有的操作,這不會成爲問題。

更新:用這種方法唯一的問題在於,假如我用[frc objectAtIndexPath:]給它的編輯視圖控制器只抓實體,然後它不再在默認情況下。通過使用NSManagedObjectContext的existingObjectWithID重新獲取默認上下文中的實體來解決此問題。仍然不是所有人都覺得很正確,但它對我有用。

+0

我有一個類似的問題,你可以找到http://stackoverflow.com/questions/11212702/nspredicate-not-executed不幸的是我不知道是什麼造成的,但我也有相同的情況,似乎我的默認上下文並不真正最新(某種意義上)。 –

+0

我也是,我剛纔評論了法比亞諾的問題。使用MR_rootSavingContext似乎沒有幫助我,我可能會使用MR的早期版本,我知道這很有用。 –

+0

+1因爲這解決了我的問題,請參閱我的答案http://stackoverflow.com/questions/11212702/nspredicate-not-executed/11407413#comment15080320_11407413 – Otto

0

意識到這是一個老的答案,但以上都不是爲我工作,希望將有助於未來的讀者

對我來說,這個問題是通過使用以前一直是一個SQLite文件試圖建立一個純粹的本地存儲所致與iCloud一起使用。

基本上我試圖用我的CoreData應用程序實現iCloud,做了基本的步驟來設置它與一個無處不在的容器等,但後來由於內在的不穩定性,這似乎導致回退(爲什麼是CoreData和iCloud STILL不要相處?!),但可可並不像你那樣回溯。

還好我沒有在現場應用做到了這一點,因此相對容易改變,因爲它只會影響發展的設備,但如果你從iCloud中移動到本地存儲在現場的程序,我想可能需要檢查這些解決方案之一:

Migrating a Core Data Store from iCloud to local