【问题标题】:NSFetchedResultsController doesn’t update from background contexts (DATAStack)NSFetchedResultsController 不会从后台上下文更新(DATAStack)
【发布时间】:2016-07-15 13:27:11
【问题描述】:

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

【问题讨论】:

    标签: swift core-data nsfetchedresultscontroller


    【解决方案1】:

    终于明白了,不是上下文问题。

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

    guard let indexPath = indexPath, newIndexPath = newIndexPath else { return }
    _tableView?.moveRowAtIndexPath(indexPath, toIndexPath: newIndexPath)
    

    这是不正确的(我不知道为什么 NSFetchedController 会在数据更改时生成移动事件而没有“重新加载数据事件”),我已经用下一个代码替换了它,现在一切正常。

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

    【讨论】:

    • 我很高兴解决了这个问题,NSFetchedResultsController 中的这种类型的错误让我希望我们有一个好的替代方案。
    【解决方案2】:

    没有很好地记录不同的背景上下文选项应该用于什么以及如何使用。可能值得提出问题/提交 PR。

    您的问题是 performInNewBackgroundContext 没有将更改合并到主上下文中。这是因为没有规定上下文层次结构,所以你可以选择你想做的事情。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 2011-10-18
      • 2011-01-10
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多