NSFetchedResultsController不从后台上下文更新(DATAStack)

时间:2016-07-15 13:27:11

标签: swift core-data nsfetchedresultscontroller

我正在使用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(),我再次获取表中的旧数据。

2 个答案:

答案 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(它会自动合并更改,即使这有点奇​​怪......)。