PHImageManager выдает «Первый этап случайного запроса изображения вернул изображение в формате, отличном от табличного, это не фатально, но это неожиданно»

#ios #swift #uiimage #phasset #photosframework

#iOS #swift #uiimage #phasset #photosframework

Вопрос:

Я использую PHImageCachingManager для получения изображений для PHAsset. Мне нужно использовать opportunistic режим, чтобы сначала загружалось доступное изображение с низким разрешением, а затем, когда становится доступным полное разрешение, оно загружается.

По какой-то причине я продолжаю получать следующее предупреждение, и мое изображение с низким разрешением не загружается. Изображение загружается только при получении самого высокого разрешения (из iCloud).

Предупреждение:

 "First stage of an opportunistic image request returned a non-table format image, this is not fatal, but it is unexpected."
  

Что я делаю не так?

     let imageRequestOptions = PHImageRequestOptions()
    imageRequestOptions.isNetworkAccessAllowed = true
    imageRequestOptions.deliveryMode = .opportunistic
    let imageCachingManager = PHCachingImageManager()

    imageCachingManager.requestImage(for: asset , targetSize: PHImageManagerMaximumSize, contentMode: .aspectFill, options: imageRequestOptions) { (image, infoDict) in
        DispatchQueue.main.async {
            if self.myImageView.identifierTag == asset.localIdentifier {
                self.myImageView.image = image
            }
        }
    }
  

Ответ №1:

 imageCachingManager.requestImage(for: asset , targetSize: PHImageManagerMaximumSize, contentMode: .aspectFill, options: imageRequestOptions) { (image, infoDict) in
    DispatchQueue.main.async {
        if self.myImageView.identifierTag == asset.localIdentifier {
            self.myImageView.image = image
        }
    }
}
  

Вы устанавливаете максимальный доступный размер в качестве размера изображения. Измените

 targetSize: PHImageManagerMaximumSize
  

Для

 targetSize: CGSize(width: asset.pixelWidth, height: asset.pixelHeight)
  

или укажите размер изображения, такой как CGSize (с: 150, высота: 150), если вы не хотите увеличить объем своего устройства из-за нехватки памяти.

Комментарии:

1. В чем разница между использованием asset.pixelWidth метода и PHImageManagerMaximumSize? Кроме того, не будет ли это просто ошибкой, если использование PHImageManagerMaximumSize не допускает случайного просмотра? Я посмотрел на используемую память, и это не так уж плохо.

2. Вы говорите, что все еще видите предупреждение с targetSize: CGSize(width: asset.pixelWidth, height: asset.pixelHeight) ?

3. Нет, я не вижу предупреждения, если я использую это. Но мне любопытно, не означает ли это, что PHImageManagerMaximumSize бесполезен для .opportunistic ? Он же ошибка?

4. Я не знаю точной разницы. Если вы сравните PHImageManagerMaximumSize и asset.size, последний неизменно меньше при фиксированной ширине.

Ответ №2:

 PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];
option.synchronous = YES;
``
将synchronous 属性设置为YES