首页 > 解决方案 > SwiftUI CoreData 异步获取

问题描述

我在带有 SwiftUI 的 macOS 应用程序中使用 CoreData。我主要利用@FetchRequestSwiftUI 向数据库发出请求。

我注意到当我在数据库中有多个对象时,FetchRequest 需要更多时间。此外,我正在使用该数据中的图像构建一个列表。当我想在内部显示带有该 FetchRequest 的视图时,该视图需要几秒钟才能加载。

我认为这是因为 FetchRequest 是在主线程上执行的。我正在寻找一种方法以异步方式向 CoreData 发出 Fetch Request,因此直接显示 UI。

但是,当数据库中有新记录时,我仍然想使用 FetchRequest 并自动更新 UI。

我虽然使用ObservableObjects和发布我的结果 via @Published,这将异步工作,但是我必须手动拉取更新。

这就是我通过@FetchRequest 请求的方式

struct ViewA: View {

    @FetchRequest(entity: Venue.entity(), sortDescriptors:[NSSortDescriptor(key:"name", ascending: true, selector: #selector(NSString.localizedStandardCompare(_:)))]) var venueItems: FetchedResults<Venue>

当我在这样的情况下显示 ViewA 时,加载视图需要几秒钟。

struct ViewWrapper: View {
    @State var currentView = 0

    var body: some View 
    {
        if(currentView == 0) { 
            Text("Dummy View")
        } else {
            ViewA() //<< when this view gets active, it takes some time to load. I need async inside View A
        }
    }

TL.DR:

我想使用 @FetchRequest 包装器,但是以异步方式,因此 UI 会立即显示,并且在后台完成获取。SwiftUI 怎么可能?

标签: macoscore-dataswiftui

解决方案


推荐阅读