我正在尝试使用核心数据实现ForEach.onMove
。我有两个实体,Parent
与Child
具有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()
}
}
}
}
}
结果:
- 没有任何类型的错误。
- 在调试
onMove
功能的过程中,我可以看到项目按要求重新排序 - 在调用
save()
之前, - 当重新加载应用程序时,重新排序显然没有保存(显然是因为
updatedObjects
设置在#3时为空)
managedObjectContext.updatedObjects
在同一调试步骤中为空我做错了什么?我怎样才能让MOC实现重订变更?
我修复了这个问题,显然有一个简单的解决方案。我把这篇文章发给未来几代的谷歌搜索者。: D
问题出在这一行:
(parent.children! as! NSMutableOrderedSet).moveObjects(at: indices, to: to)
显然,采用不可变版本并使其可变工作,但不更新托管对象。如此:
parent.mutableOrderedSetValue(forKey: "children").moveObjects(at: indices, to: to)