Загрузка изображений асинхронных в SwiftUI с DispatchQueue - PullRequest
0 голосов
/ 28 октября 2019

Я создал домашний вид с тремя навигационными ссылками. Одним щелчком мыши открывается вид со списком из 180 изображений, полученных из AWS S3. Во время прокрутки вид цепляется. Поэтому изображения должны загружаться в фоновом режиме асинхронно. Я уже реализовал функцию downsample для уменьшения занимаемой памяти. Я последовал за докладом WWDC 2018 , в котором объясняется, как реализовать асинхронную загрузку с помощью DispatchQueue. Но я не заставляю его работать. Кстати, я довольно новичок в SwiftUI и Swift.

Я попытался реализовать это, как на скриншоте из выступления WWDC. Моя реализация прокомментирована в моем собственном фрагменте кода ниже. Screenshot Я также пытался работать с платформой Combine, но не нашел решения для моей проблемы. Большинство веб-сайтов описывают, как работать с DispatchQueue в Swift, но не в SwiftUI, что затрудняет мне, с чего начать.

var body: some View {
        List {
            ForEach(range.count, id: \.self) { item in
                NavigationLink(destination: ImageLargeView()) {
                    //DispatchQueue.main.async {
                    Image(uiImage: downsample(thisReturnesAllDownsampledImagesAsUIImage))
                    //}
                }
                .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 200, alignment: .center)
                .clipped()
            }
        }
}

Моя цель - избавиться от цепляющего поведения с минимумомобъем памяти.

1 Ответ

1 голос
/ 28 октября 2019

Посмотрите на некоторые записи в блоге об асинхронной загрузке изображений в SwiftUI. Этот , например, выглядит так, как будто описывает технику, которую вам необходимо использовать идеально.

В двух словах: поместите в иерархию пользовательский вид, который обрабатывает загрузку в фоновом потоке, а затем обновитеизображение, когда представление было загружено.

Также доступны Cocoapods, например этот .

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