我是Core Data的新手,正在努力为以下场景找到一个简单的解决方案。
我有一个这样的观点:
struct SomeView: View {
@Environment(.managedObjectContext) private var viewContext
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: Item.timestamp, ascending: true)],
animation: .default)
private var items: FetchedResults<Item>
var body: some View {
List {
ForEach(items) { item in
// Render item view
}
}
}
}
每当Items
发生更改时,我都想运行一个任意的处理程序。列表视图按照我的预期进行更新,但我不确定我应该如何触发非ui代码(比如每次Items更改时发送一个API请求(。最简单的方法是什么?
四处搜索,我看到类似问题的答案指向NSFetchedResultsController
和类似的文章,但我还没有看到如何实现我想要的东西的明确例子。如果答案真的是NSFetchedResultsController
,有人能给我看完整的代码吗?
编辑:我似乎可以通过在列表视图中添加let _ = handleItemsChanged(items: items)
之类的东西来实现我想要的,但这似乎很难。有没有同样简单的清洁机制?
对于与视图生存期和数据绑定的网络调用,我们使用task
,其中的异步代码在id
参数更改时被取消并重新启动,在视图消失时也被取消。要在项目数量发生变化时运行任务,可以执行以下操作:
var body: some View {
List {
ForEach(items) { item in
// Render item view
}
}
.task(id: items.count) {
print("perform async network task")
// e.g. stateHoldingResult = await something
}
}
对于更新的项,您可以使用要比较的项的数据创建一个计算的var(即检查更改(,并将其作为id
参数提供。