SwiftUI загружает очень длинный список в asyn c способом - PullRequest
1 голос
/ 09 февраля 2020

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

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

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 ш ау (чтобы не заморозить дисплей из-за плохого пользовательского опыта)?

1 Ответ

0 голосов
/ 09 февраля 2020

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...