在StackOverflow上有很多非常相似的問題,但我這樣問,因爲幾乎所有存在的問題都是由於在FRC上不調用performFetch
造成的。NSFetchedResultController在委託中沒有調用controllerDidChangeContent
在這種情況下,我們稱之爲它。
fetchedResultsController = NSFetchedResultsController(fetchRequest: StepRecord.fetchRequest(forDate: date),
managedObjectContext: theMainThreadContext,
sectionNameKeyPath: nil,
cacheName: nil)
fetchedResultsController.delegate = self
do {
try fetchedResultsController.performFetch()
} catch (let error) {
print(error)
}
然後在後面的功能,我們有這樣的事情......
func updateScreen() {
if fetchedResultsController.fetchedObjects.count == 0 {
// download data and store into core data
}
// update the screen
}
,我們有委託方法...
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
updateScreen()
}
被寫入到地方核心數據肯定是寫入到backgroundThreadContext
(這是我們在應用程序中多次使用的模式,它在別處工作)。
但是,委託方法在這種情況下不會被調用。
如果我們退出屏幕並返回updateScreen
方法運行並且FRC有數據。因此,提取請求是正確的,下載將記錄放在正確的位置並正確保存,並且更新屏幕方法能夠獲取這些項目並填充屏幕。
我們在這裏遇到的唯一問題是委託方法沒有被調用。
有什麼我們錯過了嗎?就像我說過的,我們在一些地方使用了相同的模式,它的工作原理。只是在這種情況下,它不起作用。
讓我知道是否有任何其他代碼,你想看看,如果可以的話,我會通過它。
@ SeanLintern88 AFAIK'controllerDidChangeContent'還包含附加內容,因此在獲取請求中添加數據應該觸發委託方法。 – Fogmeister
所以你說,即使初始數據爲空,添加的數據應該會導致更新?如果是這樣你可以發佈獲取請求:D'StepRecord.fetchRequest(forDate:date)' – SeanLintern88
@ SeanLintern88是的它是如何工作的。最終得到它的工作。謝謝 – Fogmeister