У меня есть навигация и подробный вид, который отправляет словарь даты (ключ) и массив структуры (но это не важно, структура, она содержит массив строк и другие вещи.
Если Я отправляю очень очень длинный словарь, приложение зависает в выбранной строке, и подробности появляются после завершения списка для загрузки каждой записи.
struct DetailView: View {
var selectedChat: [Date: [TextStruct]]? // you can try with [Date: [String]]?
var body: some View {
List
{
ForEach(self.selectedChat.keys.sorted(), id: \.self)
{ key in //section data
Section(header:
Text("\(self.selectedChat[key]![0].date)
{
ForEach(self.selectedChat[key]!, id:\.self) {sText in
// my ChatView(sText) ....
}
}
}
}
Я пытался загрузить несколько строк в начале, добавив эту переменную
@State private var dateAndText: [Date: [TextStruct]] = [:]
, замените приведенный выше код (self.selectedChat) на self.dateAndText и на .onAppear:
.onAppear {
if let chat = self.selectedChat {
let keysDateSorted = chat.allText.keys.sorted()
self.chatLeader = chat.chatLeader
for key in keysDateSorted.prefix(30) {
self.dateAndText[key] = chat.allText[key]
}
DispatchQueue.global(qos: .utility).async {
self.dateAndText = chat.allText
self.progressBarValue = 1
}
}
}
В этом решении, как только я наберу sh строка, сразу я могу видеть первые 30 записей, и это нормально, но я не могу прокрутить, пока все записи не загружены. Я знаю, что есть способ загрузить массив, только если пользователь прокручивает в конце список, но я хочу загрузить весь список также, если пользователь не прокручивает в конце.
Итак, есть способ загрузить список частично (например, отправлять и обновлять массив каждые 100 записей) и в асин c ш ау (чтобы не заморозить дисплей из-за плохого пользовательского опыта)?