Core data SwiftUI-如何使用init中的fetchRequest更新数据
我正在视图的Core data SwiftUI-如何使用init中的fetchRequest更新数据,core-data,swiftui,Core Data,Swiftui,我正在视图的init()方法中进行CoreData获取。我没有在SwiftUI中使用FetchRequest,因为我需要一个基于参数的谓词,该参数也会发送到视图。在@FetchRequest中使用该参数将导致错误,因为变量尚未初始化 我在init()中执行以下获取请求 但是,当我从上下文中删除实体时,我需要刷新视图以显示更改。在删除操作时,我切换一个@State变量以刷新视图。这是可行的,但是实体仍然在我的数组中。这是因为不会再次调用init(),也不会再次发出获取请求。如果调用init(),则
init()
方法中进行CoreData获取。我没有在SwiftUI中使用FetchRequest,因为我需要一个基于参数的谓词,该参数也会发送到视图。在@FetchRequest中使用该参数将导致错误,因为变量尚未初始化
我在init()中执行以下获取请求
但是,当我从上下文中删除实体时,我需要刷新视图以显示更改。在删除操作时,我切换一个@State
变量以刷新视图。这是可行的,但是实体仍然在我的数组中。这是因为不会再次调用init()
,也不会再次发出获取请求。如果调用init()
,则删除的实体将不再存在
这里最好的方法是什么?如何重新蚀刻CoreData实体
我当前的解决方案:我当前正在Fetch视图中使用
绑定。如果我做了更改,我将切换该绑定并重新加载父视图。将导致我的子视图(获取视图)也重新加载,并再次发出获取请求。这是最好的办法吗?是否有更简单的解决方案?假设您已将managedObjectContext设置为这样
@Environment(\.managedObjectContext) var moc
那么我相信这个解决方案可能对你有用
func deleteArticle(at index: IndexSet) {
for i in index {
// pull the article from the FetchRequest
let article = articleRows[i]
moc.delete(article)
}
// resave to CoreData
try? moc.save()
}
在ForEach块末尾使用调用该方法
.onDelete(perform: deleteArticle)
也就是说,我不熟悉您执行获取请求的方式,因此您需要进行一些调整
- 丹
因此,我找到了解决问题的方法
出了什么问题?
视图没有更新,因为我没有使用FetchRequest属性包装器,因为我需要该FetchRequest中的实例变量。因此,我需要在我的
Init()
方法中进行抓取。但我所做的是,我只在init()
中提取了一次我的项目,除非重新加载了的父项,否则不会更新
如何解决此问题而不进行烦人的家长更新?
我没有在init()
中只执行一次手动获取,而是使用了一个FetchRequest,并在init()中对其进行了初始化,因此它仍然作为FetchRequest属性包装器运行,就像一个可观察对象一样
我这样宣布:
@FetchRequest var articleRows : FetchedResults<Article>
谢谢你的回复。我有一个使用@FetchRequest和onDelete函数的列表。这很有效。然而,在我上面的例子中,它仍然没有更新。
.onDelete(perform: deleteArticle)
@FetchRequest var articleRows : FetchedResults<Article>
//Here in my predicate I use self.type variable
var predicate = NSPredicate(format: "type == %d", self.type)
//Intialize the FetchRequest property wrapper
self._articleRows = FetchRequest(entity: Article.entity(), sortDescriptors: [], predicate: predicate)