使用Core Data实现ForEach.onMove()



我正在尝试使用核心数据实现ForEach.onMove。我有两个实体,ParentChild具有to - many关系,关系标记为Ordered。视图是这样的:

struct ParentView : View {
@ObservedObject var parent : Parent
var body : some View {
List {
ForEach($parent.children! as! [Child]) { child in 
ChildView(child)
}.onMove { 
parent.managedObjectContext!.performAndWait { indices, to in
(parent.children! as! NSMutableOrderedSet).moveObjects(at: indices, to: to)
try! parent.managedObjectContext!.save()
parent.objectWillChange.send()
}
}
}
}
}

结果:

  1. 没有任何类型的错误。
  2. 在调试onMove功能的过程中,我可以看到项目按要求重新排序
  3. 在调用save()
  4. 之前,managedObjectContext.updatedObjects在同一调试步骤中为空
  5. 当重新加载应用程序时,重新排序显然没有保存(显然是因为updatedObjects设置在#3时为空)

我做错了什么?我怎样才能让MOC实现重订变更?

我修复了这个问题,显然有一个简单的解决方案。我把这篇文章发给未来几代的谷歌搜索者。: D

问题出在这一行:

(parent.children! as! NSMutableOrderedSet).moveObjects(at: indices, to: to)

显然,采用不可变版本并使其可变工作,但不更新托管对象。如此:

parent.mutableOrderedSetValue(forKey: "children").moveObjects(at: indices, to: to)

最新更新