core-data - SwiftUI - 如何在 init 中使用 fetchRequest 更新数据
问题描述
我init()
在 View 的方法中进行 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
{
}
那工作正常。我在一个ForEach
循环中显示我的所有数据。
ForEach(self.articleRows, id:\.self) { article in
但是,当我从上下文中删除实体时,我需要刷新视图以显示更改。在删除操作中@State
,我切换一个变量以刷新视图。那行得通,但是实体仍在我的数组中。那是由于init()
没有再次调用并且没有再次发出获取请求的事实。如果init()
将被调用,则已删除的实体将不再存在。
这里最好的方法是什么?如何重新获取我的 CoreData 实体。
我目前的解决方案:我目前正在Binding
我的 Fetch 视图中使用。如果我进行更改,我会切换该绑定并重新加载我的父视图。这将导致我的子视图(获取视图)也重新加载,并再次发出获取请求。这是最好的方法吗?有什么更简单的解决方案吗?
解决方案
所以,我找到了解决我的问题的方法。
出了什么问题?
视图没有更新,因为我没有使用 FetchRequest 属性包装器,因为我需要该 FetchRequest 中的实例变量。所以我需要在我的Init()
方法中进行获取。但是我所做的是,我只是在其中获取了一次我的项目,init()
除非重新加载父级,否则不会更新。
如何在不烦人的父更新的情况下解决它?
我使用了 FetchRequest 并在 init() 中对其进行了初始化,而不是只手动获取一次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)
推荐阅读
- powershell - 使用 select-String 解析日志文件
- go - 如何使用 Golang 正确发送 RPC 调用以获取智能合约所有者?
- rangeslider - 如何禁用 RangeSlider asp.net MVC razor c#?
- php - 如果页面刷新,如何停止 rand() 生成其他整数?
- azure - Azure VM 上的 Web 服务器
- laravel - NGINX 重定向匹配位置
- angular - 基于 Angular 路由的动画:嵌套路由的问题
- algorithm - 找到最近的向量
- c++ - 重载赋值运算符 C++ 传递非常量参数
- php - 文本魔术短信 API 在 Godaddy 共享主机上出现错误