SwiftUI загружает очень длинный список в асинхронном режиме

У меня есть навигация и подробный вид, который отправляет словарь даты (ключ) и массив структуры (но это не важно, структура, она содержит массив строк и другие вещи.

Если я отправляю очень очень длинный словарь, приложение зависает в выбранной строке, и подробности появляются после завершения списка для загрузки каждой записи.

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
            }

       }
}

С этим решением, как только я нажимаю на строку, я сразу вижу первые 30 записей, и это нормально, но я не могу прокрутить, пока все записи не будут загружены. Я знаю, что есть способ загрузить массив, только если пользователь прокручивает в конце списка, но я хочу загрузить весь список также, если пользователь не прокручивает в конце.

Итак, есть способ загрузить список частично (например, отправлять и обновлять массив каждые 100 записей) и асинхронно (чтобы не заморозить отображение из-за плохого взаимодействия с пользователем)?

Всего 1 ответ


Вы почти наверняка столкнетесь с проблемами, описанными и исправленными Полом Хадсоном.

SwiftUI пытается анимировать все изменения, поэтому, если вы используете его взломать вокруг проблемы, это должно сработать, но вы потеряете все анимации между изменениями списка. Разработчики Apple ответили ему и Дэйву Делонгу, которые обсуждали это в Твиттере, они сказали, что это определенно проблема с их стороны, которую они надеются решить.

tldr статьи: Добавьте .id(UUID()) в конец инициализатора вашего List .


Есть идеи?

10000