Как правильно получить все фотографии в Swift3 iOS(почему я получаю дублированные фотографии)

Я хочу перечислить все фотографии из "My Photo Stream", вот мой код:

private func fetchAssetCollection(){
    let result = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .albumMyPhotoStream, options: nil)
    result.enumerateObjects({ (collection, index, stop) in
        if let albumName = collection.localizedTitle {
            print("Album => \(collection.localIdentifier), \(collection.estimatedAssetCount), \(albumName) ")
        }

        let assResult = PHAsset.fetchAssets(in: collection, options: nil)

        let options = PHImageRequestOptions()
        options.resizeMode = .exact
        let scale = UIScreen.main.scale
        let dimension = CGFloat(78.0)
        let size = CGSize(width: dimension * scale, height: dimension * scale)

        assResult.enumerateObjects({ (asset, index, stop) in
            print("index \(index)")
            PHImageManager.default().requestImage(for: asset, targetSize: size, contentMode: .aspectFill, options: options) { (image, info) in
                if let name = asset.originalFilename {
                    print("photo \(name) \(index) \(asset.localIdentifier)")
                }
            }

        })

    })
}



extension PHAsset {

var originalFilename: String? {

    var fname:String?

    if #available(iOS 9.0, *) {
        let resources = PHAssetResource.assetResources(for: self)
        if let resource = resources.first {
            fname = resource.originalFilename
        }
    }

    if fname == nil {
        // this is an undocumented workaround that works as of iOS 9.1
        fname = self.value(forKey: "filename") as? String
    }

    return fname
}

}

это работает, но проблема в том, что он печатает дублированную запись. Он печатает 329*2 записей, но на самом деле у меня есть 329 фотографий в моем "My Photo Stream".

photo IMG_0035.JPG 10 0671E1F3-CB7C-459E-8111-FCB381175F29/L0/001
photo IMG_0035.JPG 10 0671E1F3-CB7C-459E-8111-FCB381175F29/L0/001
......

1 ответ

Решение

Из документации для PHImageManager requestImage:

По умолчанию этот метод выполняется асинхронно. Если вы вызываете его из фонового потока, вы можете изменить isSynchronous свойство параметра параметров для true блокировать вызывающий поток, пока запрошенное изображение не будет готово или не произойдет ошибка, и в это время Photos вызывает ваш обработчик результатов.

Для асинхронного запроса Photos могут вызывать ваш блок обработчика результатов более одного раза. Фото сначала вызывает блок, чтобы предоставить низкокачественное изображение, подходящее для временного отображения, пока оно готовит высококачественное изображение. (Если данные изображения низкого качества сразу доступны, первый вызов может произойти до того, как метод вернется.) Когда изображение высокого качества будет готово, Photos снова вызывает ваш обработчик результатов, чтобы предоставить его. Если менеджер изображений уже кэшировал запрошенное изображение в полном качестве, Photos вызывает ваш обработчик результатов только один раз. PHImageResultIsDegradedKey введите параметр информации обработчика результатов, чтобы указать, когда Photos предоставляет временное изображение низкого качества.

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

Другие вопросы по тегам