我有一個問題,如果我更改核心數據對象,保存然後刷新對象,導致我的NSFetchedResultsController顯示重複的對象。我想我明白髮生了什麼事情,但我正在尋找某人來確認,並且希望能夠提供更多的細節。NSManagedObjectContext refreshObject導致重複NSFetchedResultsController
爲了更詳細地解釋我有兩個實體Fixture
和Position
。 A Fixture
有許多Positions
,並且Position
只屬於Fixture
。要重現此問題,請執行以下操作:
- 取所有位置。
- 修改該對象Fixture的某個值(任何一個)。 I.E
foo.fixture.name = "foobar"
- 保存文本
- 通過調用
context.refreshAllObjects
或context.refreshObject(foo, mergeChanges: false/true)
來刷新對象。
我有一個tableview使用顯示Fixures的抓取結果控制器。完成上述操作後,tableview將顯示每個項目的重複項(如果我使用FRC的委託方法執行更新或我只是重新加載tableview,則無關緊要)。
看來發生了什麼是刷新使FRC知道的對象失效,同時獲得另一組對象的知識。如果,如步驟#5,我打電話frc.performFetch()
,那麼問題就會消失。
其他注意事項:
- 無論多少次,我跑我的代碼只有兩每個對象的(我使用隨機按鈕來觸發它用於測試)。
- 在我的
Fixture
子類中,只要在下一次代碼運行期間(即調用刷新後)訪問我的對象的Fixture屬性,就會調用init(entityName,context)。 - 在我的示例一切都承擔同樣的背景下地方(雖然它與兒童環境發生爲好)
給一些更多的背景下,我怎麼擺在首位用戶得到了自己在這種情況下,可以點擊列表中的一個夾具,然後最終縮小到幾個屏幕後的一個位置,在那裏他們可以執行修改夾具的操作。此時應用程序還有其他活動區域正在偵聽NSManagedObjectContextDidSaveNotification,我希望它們更新其對象以便它們可以顯示正確的數據,這就是我調用refresh的原因。
我在文檔中挖了一遍,我看不到任何具體解釋我的理論的東西,即更新上下文會導致NSFetchedResultsController產生無效的對象。任何人都可以闡明這種行爲?
如果您使用的是'NSFetchedResultsController'並且實現了委託方法,那麼控制器將跟蹤所有更改並相應地更新UI。那麼就不需要明確的刷新。 – vadian
顯式刷新發生在完全獨立於NSFetchedResultsController的地方。由於實時服務器更新(在後臺),可能會發生更改。所以在使用FRC的頁面之後的頁面上,我需要獲得最新的信息,這就是爲什麼我要求上下文重新創建對象。 – Brandon