Загрузка UIImages в collectionView из локального хранилища происходит очень медленно - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь загрузить некоторые изображения, сохраненные локально (используя Диск ), в UICollectionView .Всякий раз, когда я пытаюсь их получить, приложение зависает примерно на 10 секунд.Это говорит мне, что я делаю что-то очень неправильное.

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

Изображения импортируются с iPhone пользователя и не сжимаются.При загрузке я загружаю все изображение (я знаю, что это плохо).

Может ли кто-нибудь указать мне правильное направление?

Вот первая часть процесса загрузки:

   func fetchImage(path: String, imageID: String, completionHandler: @escaping (() throws -> UIImage) -> Void) {
    do {
        let imagePath = path + imageID + ".png"
        let image = try Disk.retrieve(imagePath, from: .documents, as: UIImage.self)
        completionHandler{ return image }
    } catch {
        completionHandler{ throw AlbumStoreError.CannotFetch("Cannot fetch Image with Error: \(error)") }
    }
}

здесь Вторая часть

func fetchImages(path: String, completionHandler: @escaping ([UIImage]) -> Void) {
    albumsStore.fetchImages(path: path) { (images: () throws -> [UIImage]) in
        do{
            let images = try images()
            DispatchQueue.main.async {
                completionHandler(images)
            }
        } catch {
            DispatchQueue.main.async {
                completionHandler([])
            }
        }
    }
}

вот как это представлено.В основном он возвращает весь массив и перезагружает представление коллекции

func presentImages(response: Collage.Images.Save.Response){
    let images = response.images
    let viewModel = Collage.Images.ViewModel(images: images)
    viewController?.displayImages(viewModel: viewModel) }

1 Ответ

0 голосов
/ 15 ноября 2018

Проблема здесь не в скорости доступа к локальному хранилищу, а в рендеринге изображений.Вы загружаете все изображения из хранилища и визуализируете их, даже для ячеек представления коллекции, которые могут находиться за пределами экрана, прежде чем что-либо отображать.

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

Полное объяснение того, как сделать это правильно, слишком длинное для ответа здесь, но есть множество примеров и руководств о том, как это сделать, только асинхронная загрузка Google или отложенная загрузка.Также обратите внимание на API предварительной загрузки, представленный в iOS 10.

См., Например, https://medium.com/capital-one-tech/smooth-scrolling-in-uitableview-and-uicollectionview-a012045d77f или документацию Apple по предварительной выборке: https://developer.apple.com/documentation/uikit/uicollectionviewdatasourceprefetching/prefetching_collection_view_data

...