Список SwiftUI зависает при обновлении @ObservedObject - PullRequest
2 голосов
/ 03 февраля 2020

У меня есть список, который автоматически выбирает больше данных ближе к концу:

struct AdCardListView: View {
    @ObservedObject var model: AdListViewModel = AdListViewModel()

    var body: some View {
        List { ForEach(self.model.adArray.enumerated().map({ $0 }), id: \.element.id) { index, ad in
                AdCardView(ad: ad)
                    .onAppear {
                        DispatchQueue.main.async {
                            let count = self.model.adArray.count
                            if index >= count - 5 { //5 Views to the end, start loading more.
                                self.model.fetch(count: count)
                            }
                        }
                }
                }
            }
    }
}

Модель выглядит следующим образом:

final class AdListViewModel: ObservableObject {
    @Published var adArray = [Ad]()
    ...
 func fetch(count: Int = 0) {
    ...
    DispatchQueue.main.async {
        self.adArray.append(contentsOf: newAds) //<-- problem here
    }
    ...
}

Моя проблема: каждая модификация @ Опубликовано / @ ObservedObject у меня есть немного заморозить при прокрутке списка. Кроме того, я обнаружил, что List пересчитывает тело всех видимых представлений + несколько представлений сверху и снизу.

Но я не могу определить, что приводит к зависанию прокрутки, и исправить это (возможно, остановка - это передача в расстояние равно (скорость прокрутки * время рендеринга)?

Почему SwiftUI пересчитывает тела на существующих видах? Они не изменились!

Можете ли вы мне помочь?

1 Ответ

2 голосов
/ 18 февраля 2020

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

Вы пытались добавить модификатор .id(UUID()) в свой Список, чтобы анимации были удаляется, и список обновляется после обновлений.

...