SwiftUI - 如何在 init 中使用 fetchRequest 更新数据

dav*_*dev 2 core-data swiftui

我正在我init()的视图方法中执行 CoreData 获取。我没有在 SwiftUI 中使用 FetchRequest,因为我需要一个基于参数的谓词,该参数也发送到视图。在 @FetchRequest 中使用该参数将导致错误,因为该变量尚未初始化。

我正在 init() 中执行以下 fetch Request

//FetchRequest
let fetch : NSFetchRequest<Article>
self.articleRows = [Article]()
fetch = Article.fetchRequest() as! NSFetchRequest<Article>
fetch.predicate = NSPredicate(format: "type == %d", self.type)

do {
    self.articleRows = try NSManagedObjectContext.current.fetch(fetch)
} catch
{
}
Run Code Online (Sandbox Code Playgroud)

那工作正常。我在ForEach循环中显示我的所有数据。

ForEach(self.articleRows, id:\.self) { article in
Run Code Online (Sandbox Code Playgroud)

但是,当我从上下文中删除实体时,我需要刷新视图以显示更改。在删除操作时,我切换一个@State变量,以刷新视图。这有效,但是实体仍在我的数组中。那是因为init()不会再次调用并且不会再次发出提取请求。如果init()会被调用,被删除的实体将不再存在。

这里最好的方法是什么?如何重新获取我的 CoreData 实体。

我目前的解决方案:我目前Binding在我的 Fetch 视图中使用一个。如果我进行更改,我会切换该绑定并重新加载我的父视图。这将导致我的子视图(获取视图)也重新加载并再次发出获取请求。这是最好的方法吗?任何更简单的解决方案?

dav*_*dev 10

所以,我找到了解决我问题的方法。

出了什么问题?

视图没有更新,因为我没有使用 FetchRequest 属性包装器,因为我需要在该 FetchRequest 中有一个实例变量。所以我需要在我的Init()方法中进行 Fetching 。但是我所做的是,我只是在 中提取了我的项目一次,init()除非重新加载父项,否则不会更新。

如何在不烦人的父更新的情况下解决它?

init()我使用了 FetchRequest 并在 init() 中对其进行了初始化,而不是仅手动获取一次,因此它仍然表现为 FetchRequest 属性包装器,就像一个 Observable 对象。

我是这样声明的:

@FetchRequest var articleRows : FetchedResults<Article>
Run Code Online (Sandbox Code Playgroud)

而里面 init()

//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)
Run Code Online (Sandbox Code Playgroud)