首页 > 解决方案 > 使用 Swift 5/SwiftUI 更新使用谓词的 @FetchRequest

问题描述

首先,我试图在网上搜索这个问题,虽然出现了类似的问题,但我还没有找到解决方案。

我一直在使用一些 SwiftUI 教程来开始使用 CoreData 和 @FetchResults 属性包装器。我有两个包装器,一个返回所有结果,一个用于过滤谓词。

当新数据添加到 CoreData 模型时,收集所有内容的结果会自动更新(并显示在列表中以供调试)。但是,另一个包装器没有更新,据我所知,这是由于在构造中使用了谓词。当我重新加载我的应用程序时,第二个包装器开始返回结果,这让我相信@FetchResults 没有识别出有变化并更新了它的结果。

我的代码非常简单:

struct ContentView: View {
    @Environment(\.managedObjectContext) private var viewContext
    
    // Fetch Request
    @FetchRequest(sortDescriptors: []) private var Object : FetchedResults<Object>
    @FetchRequest(sortDescriptors: [], predicate: NSPredicate(format: "datetime >= %@ AND datetime < %@ AND type == %@", Calendar.current.startOfDay(for: Date()) as NSDate, Date() as NSDate, "Test")) private var ObjectsToday : FetchedResults<Object>

 var body: some View {

        ...

我有一个按钮,它只是填充 CoreData,当我添加新数据时,它会显示在Objects结果中,但不会出现在ObjectsToday列表中。是否有重新加载此 FetchRequest 的技术?我可以看到有,self._ObjectsToday.Update()但由于它是不可变的,我无法访问它。

我正在使用 Xcode 11.3.1(不是最新最好的),我找不到任何关于如何克服这个问题的例子。我可以通过手动过滤我的全套结果来避免使用这个额外的 FetchRequest,以识别我需要更新的数据,但是当这些工具存在时,这似乎过分了。

重申一下,当我重新加载应用程序时,这个结果会被填充,这让我认为某处的自动更新中缺少某些东西。

非常感谢!

标签: iosswiftxcodeswiftui

解决方案


推荐阅读