Как отобразить библиотеку фотографий в collectionView, используя меньше памяти - PullRequest
0 голосов
/ 20 октября 2018

Я сталкиваюсь с проблемой, когда люди говорят, что происходит сбой приложения при загрузке библиотеки фотографий в collectionView.Большую часть времени они имеют более 2-3 тысяч фотографий.Для меня это работает нормально.(У меня в библиотеке менее 1000 фотографий).

Вопрос: может быть, есть какой-нибудь способ отобразить изображения в коллекции. Более «умный» и использующий меньше памяти?PS Может быть, когда у пользователя есть все его фотографии в iCloud, это тоже может вызвать сбой?Потому что до сих пор я думал, что приложение не загружает фотографии при загрузке его в ячейку.Может быть, кто-то может доказать или не одобрить этот факт.

Вот моя функция:

func grabPhotos(){

    let imgManager = PHImageManager.default()

    let requestOptions = PHImageRequestOptions()
    requestOptions.isSynchronous = false
    requestOptions.deliveryMode = .opportunistic // Quality of images
    requestOptions.isNetworkAccessAllowed = true

    requestOptions.isSynchronous = true
    requestOptions.progressHandler = {  (progress, error, stop, info) in
        print("progress: \(progress)")
    }

    let fetchOptions = PHFetchOptions()
    fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

    if let fetchResult : PHFetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions) {

        if fetchResult.count > 0 {
            for i in 0..<fetchResult.count {
                imgManager.requestImage(for: fetchResult.object(at: i) , targetSize: CGSize(width: 150, height: 150), contentMode: .aspectFill, options: requestOptions, resultHandler: { image, error in
                    self.imageArray.append(image!)
                    self.kolekcija.reloadData()
                })
            }
        }
        else {
            print("You got no photos")
            kolekcija.reloadData()
        }
    }

}

1 Ответ

0 голосов
/ 21 октября 2018

Проблема в этой строке:

self.imageArray.append(image!)

Никогда не создавайте массив изображений.Изображения огромны, и вам не хватит памяти.

Это представление коллекции.Вы просто предоставляете изображение по требованию в itemForRowAt:, и вы предоставляете маленькую версию изображения (так называемая миниатюра ), наименьшая возможная для размера дисплея,Таким образом, в любое время достаточно только эскизов, чтобы заполнить видимый экран;это не занимает много памяти, плюс среда выполнения может освободить память изображения, когда изображение прокручивается за пределы экрана.

Для этого предназначен PHCachingImageManager.Посмотрите, как Apple справляется с этим в своем примере кода:

https://developer.apple.com/library/archive/samplecode/UsingPhotosFramework/Listings/Shared_AssetGridViewController_swift.html

В этом примере нет массива изображений где-нибудь .

...