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

标签 core-data swiftui

我正在我的 init() 中执行 CoreData 获取 View 的方法。我没有在 SwiftUI 中使用 FetchRequest,因为我需要一个基于参数的谓词,该参数也发送到 View 。在@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
{
}
那工作正常。我在 ForEach 中显示我的所有数据环形。
ForEach(self.articleRows, id:\.self) { article in
但是,当我从上下文中删除实体时,我需要刷新 View 以显示更改。在删除操作时,我切换 @State变量,刷新 View 。这有效,但是实体仍在我的数组中。那是因为init()不会再次调用并且不会再次发出获取请求。如 init()将被调用,被删除的实体将不再存在。
这里最好的方法是什么?如何重新获取我的 CoreData 实体。
我目前的解决方案:我目前正在使用 Binding在我的 Fetch View 中。如果我进行更改,我会切换该绑定(bind)并重新加载我的父 View 。这将导致我的 subview (获取 View )也重新加载并再次发出获取请求。这是最好的方法吗?任何更简单的解决方案?

最佳答案

所以,我找到了解决我的问题的方法。
出了什么问题?
View 没有更新,因为我没有使用 FetchRequest 属性包装器,因为我需要在该 FetchRequest 中有一个实例变量。所以我需要在我的 Init() 里面做 Fetching方法。但我所做的是,我只是在 init() 中取了一次我的元素。除非重新加载父级,否则不会更新。
如何在不烦人的父更新的情况下解决它?
而不是在 init() 中只进行一次手动获取我使用了 FetchRequest 并在 init() 中对其进行了初始化,因此它仍然表现为 FetchRequest 属性包装器,就像一个 Observable 对象。
我是这样声明的:

@FetchRequest var articleRows : FetchedResults<Article>
而在 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)

关于core-data - SwiftUI - 如何在 init 中使用 fetchRequest 更新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62636252/

相关文章:

ios - SwiftUI:显示重复按钮且未触发操作的催化剂警报

ios - 使用 SwiftUI 呈现多个模式表

ios - 尝试隐藏选项卡栏 SwiftUI 时出现问题

ios - 对齐指南()不覆盖 subview

swift - 从 Coredata 加载数据时,我在控制台中收到警告

ios - 如何从 2 个不同的 View Controller 观察 NSManagedObject 记录的变化?

ios - 如何使用 Swift 4 的 MagicalRecord 正确获取数据?

ios - SwiftUI 中的惰性属性

objective-c - 每次在核心数据中插入数据后,应用程序变得更慢

cocoa - 带有核心数据的基于文档的应用程序与普通核心数据应用程序?