首页 > 解决方案 > 如何在 SwiftUI Core Data @FetchRequest 中使用常量变量?

问题描述

如何@FetchRequest在 SwiftUI 中使用基于从父视图传入的变量的获取请求,同时确保视图根据核心数据更改进行更新?


我有这个问题,@FetchRequest在将变量传递给获取请求时在 SwiftUI 中使用不起作用。它会导致以下错误:

不能在属性初始值设定项中使用实例成员“名称”;属性初始化程序在“自我”可用之前运行

struct DetailView: View {
    @FetchRequest(fetchRequest: Report.fetchRequest(name: name), animation: .default)
    private var data: FetchedResults<Report>

    let name: String

    var body: some View {
        Text("\(data.first?.summary.text ?? "")")
            .navigationTitle(name)
            .onAppear {
                ReportAPI.shared.fetch(for: name) // Make network request to get Report data then save to Core Data
            }
    }
}
extension Report {
    @nonobjc public class func fetchRequest(name: String) -> NSFetchRequest<Report> {
        let fetchRequest = NSFetchRequest<Report>(entityName: "Report")

        fetchRequest.fetchLimit = 1
        fetchRequest.sortDescriptors = [NSSortDescriptor(keyPath: \Report.createdAt, ascending: true)]
        fetchRequest.predicate = NSPredicate(format: "details.name == %@", name)

        return fetchRequest
    }
}

此视图是使用NavigationLink来自先前视图的 a 推送的。喜欢:NavigationLink(destination: DetailView(name: item.name))

我已经查看了这个答案,但我认为它不适用于我的用例,因为通常@FetchRequest属性包装器会自动侦听数据更改并自动更新。由于我正在进行异步调用以发出网络请求并更新核心数据,因此我需要该data变量在完成后动态更新。


我也看过这个答案,但我认为它有一些与上面提到的相同的问题(尽管我不确定)。我在使用该代码时也遇到了错误self.data = FetchRequest(fetchRequest: Report.fetchRequest(name: name), animation: .default)。所以我不确定如何在这里测试我的理论。

无法分配给属性:“数据”是仅获取属性

struct DetailView: View {
    @FetchRequest
    private var data: FetchedResults<Report>

    let name: String

    var body: some View {
        Text("\(data.first?.summary.text ?? "")")
            .navigationTitle(name)
            .onAppear {
                ReportAPI.shared.fetch(for: name) // Make network request to get Report data then save to Core Data
            }
    }

    init(name: String) {
        self.name = name
        self.data = FetchRequest(fetchRequest: Report.fetchRequest(name: name), animation: .default)
    }
}

因此,我认为这个问题与我的问题不同,因为我需要确保视图会根据 Core Data 的变化动态更新(即,当fetch方法将新数据保存到 Core Data.

标签: iosswiftcore-dataswiftui

解决方案


推荐阅读