#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. Это не просто ставка на то, когда запрос на выборку будет завершен?