我目前有一個問題,即在後臺子線程(其母公司是主UI線程上下文)和儲蓄導致創建新對象我NSFetchedResultsController
顯示兩個新的對象:一個用臨時objectID
,以及一個用永久objectID
。這似乎是某種錯誤,除非我錯過了一些東西。何時調用obtainPermanentIDsForObjects:?
所以我想我會手動獲得永久編號爲我創建任何新的對象。這修復了重複行問題,但引入了新的隨機錯誤(例如「無法完成對象的錯誤」,引用了我創建的新對象)。如果任何人有任何想法,爲什麼之前提到的任何發生,請分享。
我猜obtainPermanentIDs
是朝着正確方向邁出的一步。但是,我什麼時候調用這個方法?保存到子上下文之前?保存孩子之後,在父母之前?父母之後? 目前我的設置是這樣的:
masterMOC - private queue tied to the persistent store, so physical saves happen here
----mainMOC - main queue tied to the UI, child of masterMOC
-------backgroundMOC - private queue, child of mainMOC
所以,如果我在backgroundMOC
創建一個新的對象,我打算立刻保存到磁盤(這意味着我將不得不調用保存:在所有三個上下文),其中我應該打電話給obtainPermanentIDs
?
(或者,如果任何人有比調用獲得永久IDS等不同的解決方案是什麼的問題是這種方法介紹無論如何要解決爲什麼我會想調用這個方法???)
更新: 我認爲我知道發生了什麼事情(這只是一個理論),但不是如何解決它。核心數據顯然會在物理保存到磁盤時爲對象生成永久ID。所以在我的情況下,這將不會發生,直到我調用masterMOC保存。目前正在創建的backgroundMOC一個新的對象時,我做的是:
- 節省backgroundMOC(這樣的變化是一個級別被推到mainMOC和我的表視圖可以插入新行)
- 保存在mainMOC
- 節省masterMOC(其最後保存到磁盤)(這樣我就可以保存到磁盤準備)
這裏發生的事情是,調用保存在backgroundMOC觸發UI更新,並導致獲取結果控制器以插入仍然存在的新對象只是臨時ID。但是,然後調用masterMOC上的保存會導致所有對象被分配永久ID,導致另一個UI更新,爲此「新」對象插入另一行!通過評論最後一次masterMOC保存,我不再看到重複條目。我在這裏做錯了什麼,或者這是一種錯誤?
另一個更新:我覺得我已經差不多確定的bug。我在backgroundMOC上調用save,然後設置一個定時器,在5秒鐘後調用mainMOC和masterMOC上的save。 Immediatley保存到backgroundMOC後,將新行插入到我的表中。 5秒鐘後(在保存main和master時),插入另一個新行。 (首先插入的行具有臨時ID,並且最新的插入具有永久ID)。
你的評論以某種方式幫助我,但以另一種方式。 我正在使用一個NSFetchedresults控制器,它得到temporaryIds以及永久。所以每次控制器調用didchangecontent時,我都會爲所有獲取的對象創建一個obtainPermanentIDsForObjects:它現在可以完美工作! –
@JoãoNunes仍然沒有爲我工作,我的ID已經是永久性的,這個錯誤仍然在提示 –
你有什麼樣的錯誤? –