我正在使用NSFetchedResultsController和DATAStack。如果我在另一个上下文中进行任何更改,我的NSFetchedResultsController不会更新我的表。
我在NSFetchedResultsController中使用dataStack.mainContext
。如果我从mainContext做任何更新,一切都还可以。但是,如果我写这样的代码,例如:
dataStack.performInNewBackgroundContext({ (backgroundContext) in
// Get again NSManagedObject in correct context,
// original self.task now in main context
let backTask = backgroundContext.objectWithID(self.task.objectID) as! CTask
backTask.completed = true
let _ = try? backgroundContext.save()
})
NSFetchedResultsController不更新单元格。如果我重新加载应用程序或整个视图,我会看到更新的数据。
数据保存没有错误(我已经检查过)。
我已经尝试检查收到NSManagedObjectContextDidSaveNotification,但如果我在收到通知后执行.performFetch(),我再次获取表中的旧数据。
答案 0 :(得分:1)
最后我明白了,这不是背景问题。
如果didChangeObject
移动(我认为因为排序而生成了该事件),我在NSFetchedResultsControllerDelegate
的{{1}} func中使用了这种类型的代码:
NSFetchedResultsChangeType
这是不正确的(我不知道为什么NSFetchedController在没有“重载数据事件”的情况下生成移动事件,如果数据被更改),我已经用下一个代码替换它,现在一切正常。
guard let indexPath = indexPath, newIndexPath = newIndexPath else { return }
_tableView?.moveRowAtIndexPath(indexPath, toIndexPath: newIndexPath)
答案 1 :(得分:0)
没有详细记录应该使用的不同背景上下文选项以及如何使用。可能值得提出问题/提交PR。
您的问题是performInNewBackgroundContext
没有将更改合并到主要上下文中。这是因为上下文层次结构没有规定,因此您可以选择要执行的操作。
因此,您可以监控保存并自行合并更改。或者您可以设置父上下文。或者您可以使用newBackgroundContext
(它会自动合并更改,即使这有点奇怪......)。