requestImageDataForAsset не удается, когда мы запрашиваем PHAsset в iPhone SDK?

Я использую инфраструктуру фотографий на iOS9.2, и мы запрашиваем данные изображения для PHAsset, используя метод requestImageDataForAsset. Большую часть времени он работает, но некоторое время его imageData равен нулю, в случае, когда мы запрашиваем Asset с большой продолжительностью видео, и словарь результатов содержит все пары ключ-значение, которые входят в каждый набор PHAsset.

Вот некоторый код, где я запрашивал imageData с помощью requestImageDataForAsset, но я все равно никогда не получал imageData.

@autoreleasepool {
        __block NSData *data = nil;
        dispatch_semaphore_t sem = dispatch_semaphore_create(0);

        PHImageRequestOptions* options = [[PHImageRequestOptions alloc] init];
        options.synchronous = YES;
        options.version = PHImageRequestOptionsVersionOriginal;
        options.networkAccessAllowed = YES;
        options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;

        [[PHImageManager defaultManager] requestImageDataForAsset:assest options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
            data = imageData;
            dispatch_semaphore_signal(sem);
        }];

        dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);

        return data;
    }

1 ответ

Я заметил две вещи:

  1. Почему вы используете семафор для блокировки? Вы устанавливаете установленное синхронное свойство PHImageRequestOptions в YES, что должно быть достаточно для не асинхронного (блокирующего) запроса.
  2. requestImageDataForAsset метод PHImageManager возвращает сопоставленный файл NSData объекты. Они ограничены размером около 1 ГБ. Если вы вызываете requestImageDataForAsset для больших видео активов, NSData объект не может быть создан, и вы получите нулевой объект в качестве возврата. Чтобы запросить данные для видео, пожалуйста, посмотрите на requestExportSessionForVideo,
Другие вопросы по тегам