Swift NSFetchedResultsController不’;t从背景上下文更新(DATAStack)

Swift NSFetchedResultsController不’;t从背景上下文更新(DATAStack),swift,core-data,nsfetchedresultscontroller,Swift,Core Data,Nsfetchedresultscontroller,我正在使用NSFetchedResultsController和。如果我在其他上下文中进行任何更改,我的NSFetchedResultsController不会更新我的表 我在NSFetchedResultsController中使用了dataStack.mainContext。如果我从mainContext进行任何更新,一切都正常。但是,如果我编写这样的代码,例如: dataStack.performInNewBackgroundContext({ (backgroundCon

我正在使用NSFetchedResultsController和。如果我在其他上下文中进行任何更改,我的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()在收到通知后,我会再次在表中获取旧数据。

不同的后台上下文选项应该用于什么以及如何使用,文档记录得不是很好。可能值得提出问题/提交PR

您的问题是,
performInNewBackgroundContext
没有将更改合并到主上下文中。这是因为没有规定上下文层次结构,所以您可以选择要执行的操作


因此,您可以自己监视保存和合并更改。或者您可以设置父上下文。或者您可以使用
newBackgroundContext
(它会自动合并更改,尽管这有点奇怪…。

最后我得到了它,这不是上下文问题

我在
NSFetchedResultsControllerDelegate
中的
didChangeObject
func中使用过这种类型的代码,如果
NSFetchedResultsChangeType
Move(我认为该事件是由于排序而生成的):

这是不正确的(如果数据被更改,我不知道为什么NSFetchedController在没有«重新加载数据事件»的情况下生成移动事件),我用下一个代码替换了它,现在一切都正常了

guard let indexPath = indexPath, newIndexPath = newIndexPath else { return }
_tableView?.deleteRowsAtIndexPaths([indexPath], withRowAnimation:   UITableViewRowAnimation.Fade)
_tableView?.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: UITableViewRowAnimation.Fade)

我很高兴能够解决这个问题,NSFetchedResultsController中的这种类型的bug让我希望我们有一个好的选择。
guard let indexPath = indexPath, newIndexPath = newIndexPath else { return }
_tableView?.deleteRowsAtIndexPaths([indexPath], withRowAnimation:   UITableViewRowAnimation.Fade)
_tableView?.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: UITableViewRowAnimation.Fade)