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)