首页 > 解决方案 > 需要在构造函数中初始化@State var,但是@FetchRequest 还没有返回

问题描述

我有两个符合协议的核心数据类GalleryItem。首先我得到负载数据FetchRequest

    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \CloudPage.orderIndex, ascending: true)],
        animation: .default)
    private var pages: FetchedResults<CloudPage>

    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \Folder.orderIndex, ascending: true)],
        animation: .default)
    private var folders: FetchedResults<Folder>

    // I also have this items array
    @State var items:[GalleryItem]

items在这里我试图初始化init

    init() {
        self.items = getOrderedItems()
    }

这是getOrderedItems()

func getOrderedItems(in folder:Folder?) -> [GalleryItem] {
        let pages = getAllPages()
        let folders = getAllFolders()
        return (pages + folders).sorted {
            $0.getOrderIndex() < $1.getOrderIndex()
        }
    }

问题是,运行时pagesandfolders数组是空的。这些函数的实现非常简单:

func getAllPages() -> [CloudPage] {
        var arr:[CloudPage] = []
        for p in pages {
            arr.append(p)
        }
        return arr
    }
    
    func getAllFolders() -> [Folder] {
        var arr:[Folder] = []
        for p in folders {
            arr.append(p)
        }
        return arr
    }

我猜 init 中的代码在请求完成之前正在运行?我怎样才能等待请求完成,以免items最终为空?

标签: iosswiftswiftui

解决方案


而不是这个

    @State var items:[GalleryItem]

    init() {
        self.items = getOrderedItems()
    }

通常的模式是在 中执行此操作onAppear,例如

    @State var items:[GalleryItem] = []

    var body: some View {
        Text("Your root view here")
          .onAppear {
             self.items = getOrderedItems()      // << here !!
          }
    }

推荐阅读