应该

时间:2016-04-27 19:13:22

标签: swift core-data nsfetchedresultscontroller

我有一个非常标准的NSFetchedResultsController(或NSFRC);

  • 没有谓词集
  • 获取一个实体类型的所有项目
  • NSDate字段(降序)
  • 排序
  • 代表设置
  • 获取数据

接下来数据会更新:

  • 后台线程更新数据
  • 排序顺序中使用的字段与其他字段一起更改。
  • 更改将合并到主线程的ObjectContext
  • NSFRC很好地将更改传递给TableView,除了订单更改
  • 如果我动画更改无关紧要,或只是执行reloadData(),数据更改,则订单不会。

我希望委托例如交换第一行和第二行,因为第二行的日期值现在高于第一行。

如果我重新打开ViewController(因此在新VC和NSFRC上再次完成提取),订单会按预期更改。但这对用户来说只是直观的。

有人可以请我指出可能的地方来搜索我的错误吗?

重申:

  • 正在委派对内容的更改,即另一个字段包含文本,该文本会更改。
  • 订单未被更改。因此,看起来SortOrder仅在第一次获取时使用。

这是两个截图,第二行(日期)也是排序顺序。第二个图像显示更新的数据,但排序顺序错误。

之前

Situation before the data update

Situation after the data update

1 个答案:

答案 0 :(得分:-1)

当您的数据发生变化时,您可能需要使NSFRC无效,并让它自行完成。例如。假设您有一个更改项目顺序的功能。如果您使用的是标准Apple代码,则应该有类似的内容

func updateSort () {

    _fetchedResultsController = nil //Here is the magic
    tableView.reloadData()
}

// MARK: - Core Data
var fetchedResultsController:NSFetchedResultsController {
    if _fetchedResultsController != nil {
        return _fetchedResultsController!
    }

    // do your basic initialization and set the delegate and return it

    return _fetchedResultsController!

}

 var _fetchedResultsController: NSFetchedResultsController? = nil