Необходимо инициализировать @State var в конструкторе, но @fetchRequest еще не вернулся

#ios #swift #swiftui

#iOS #swift #swiftui

Вопрос:

У меня есть два основных класса данных, которые соответствуют протоколу 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()
        }
    }
 

Проблема в том, pages folders что массивы and пусты при запуске. Эти функции имеют довольно простые реализации:

 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 он не оказался пустым?

Ответ №1:

Вместо этого

     @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 !!
          }
    }
 

Комментарии:

1. Это не просто ставка на то, когда запрос на выборку будет завершен?