2015-01-27 3 views
18

Я использую фреймворк фотографий на iOS8.1 и запрашиваю данные изображения для объекта с помощью requestImageDataForAsset ... В большинстве случаев он работает, и я получаю данные изображения и словарь, содержащий то, что вы Смотри ниже. Но иногда вызов завершается, но данные равны нулю, а словарь содержит три генерирующих элемента.Фотографии Framework requestImageDataForAsset иногда не удается

Вызовы выполняются последовательно и в одном потоке. Это не относится к какому-либо конкретному изображению. Ошибка будет происходить на изображениях, которые я успешно открыл в прошлом. Кто-нибудь сталкивался с этим?

+ (NSData *)retrieveAssetDataPhotosFramework:(NSURL *)urlMedia resolution:(CGFloat)resolution imageOrientation:(ALAssetOrientation*)imageOrientation { 

    __block NSData *iData = nil; 

    PHFetchResult *result = [PHAsset fetchAssetsWithALAssetURLs:@[urlMedia] options:nil]; 
    PHAsset *asset = [result firstObject]; 

    PHImageManager *imageManager = [PHImageManager defaultManager]; 
    PHImageRequestOptions *options = [[PHImageRequestOptions alloc]init]; 
    options.synchronous = YES; 
    options.version = PHImageRequestOptionsVersionCurrent; 

    @autoreleasepool { 
     [imageManager requestImageDataForAsset:asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { 
      iData = [imageData copy]; 
      NSLog(@"requestImageDataForAsset returned info(%@)", info); 
      *imageOrientation = (ALAssetOrientation)orientation; 
     }]; 
    } 

    assert(iData.length != 0); 
    return iData; 
} 

Это желаемый результат, когда я получаю данные изображения и словарь метаданных:

requestImageDataForAsset returned info({ 
    PHImageFileDataKey = <PLXPCShMemData: 0x1702214a0> bufferLength=1753088 dataLength=1749524; 
    PHImageFileOrientationKey = 1; 
    PHImageFileSandboxExtensionTokenKey = "6e14948c4d0019fbb4d14cc5e021199f724f0323;00000000;00000000;000000000000001a;com.apple.app-sandbox.read;00000001;01000003;000000000009da80;/private/var/mobile/Media/DCIM/107APPLE/IMG_7258.JPG"; 
    PHImageFileURLKey = "file:///var/mobile/Media/DCIM/107APPLE/IMG_7258.JPG"; 
    PHImageFileUTIKey = "public.jpeg"; 
    PHImageResultDeliveredImageFormatKey = 9999; 
    PHImageResultIsDegradedKey = 0; 
    PHImageResultIsInCloudKey = 0; 
    PHImageResultIsPlaceholderKey = 0; 
    PHImageResultWantedImageFormatKey = 9999; 
}) 

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

requestImageDataForAsset returned info({ 
    PHImageResultDeliveredImageFormatKey = 9999; 
    PHImageResultIsDegradedKey = 0; 
    PHImageResultWantedImageFormatKey = 9999; 
}) 
+0

Это также происходит со мной, для изображений в общих потоках iCloud. Пока нет решения. – an0

+0

Кажется, что это происходит регулярно (около 100%) при попытке использовать options.synchronous = YES для получения изображения для актива в потоке фото iCloud (a.k.a., Shared Album), который еще не был загружен. Если изображение было загружено и кэшировано либо приложением «Фотографии», либо асинхронно с помощью моего приложения, оно отлично работает. В противном случае синхронная загрузка всегда терпит неудачу. Я пробовал iOS 8.x, 9.0 и 9.1 с теми же результатами. – LenK

+0

Я также сталкиваюсь с этой проблемой. Мое обходное решение заключается в установке options.synchronous = NO –

ответ

3

Вероятно, вы итерации через массив, и память не освобождается своевременно, вы можете попробовать приведенный ниже код. Убедитесь, что theData отмечен __block.

@autoreleasepool { 
    [imageManager requestImageDataForAsset:asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { 
     NSLog(@"requestImageDataForAsset returned info(%@)", info); 
     theData = [imageData copy]; 
    }]; 
} 
+0

Спасибо gabbler. @ Autoreleasepool помогает уменьшить использование памяти под нагрузкой (получение нескольких изображений подряд), но проблема сохраняется. –

+0

Опубликуйте свой код извлечения нескольких изображений подряд. – gabbler

+0

Я обновил сообщение, чтобы показать весь метод. Я завернул requestImageDataForAsset в методе класса, чтобы защитить вызывающего абонента от ухода за версией iOS. Аналогичный метод для ALAssetsLibrary вызывается на iOS7. Код не вызывается в цикле, а может происходить несколько событий, когда разные изображения запрашиваются примерно в одно и то же время. Проблема несовместима. В прошлый день этого не произошло. Иногда это происходит здесь и там. Иногда это происходит в 50% случаев, когда запрашивается фотография. –

0

Возвращаясь к этому через некоторое время, я решил большую часть своей проблемы. Нет тайны, просто плохой код:

PHFetchResult *result = [PHAsset fetchAssetsWithALAssetURLs:@[urlMedia] options:nil]; 
PHAsset *asset = [result firstObject]; 

if (asset != nil) { // the fix 
    PHImageManager *imageManager = [PHImageManager defaultManager]; 
    PHImageRequestOptions *options = [[PHImageRequestOptions alloc]init]; 
    ... 
} 

Наиболее распространенной причиной для меня была проблема с медиа URL передается fetchAssetsWithALAssetURLs вызывающего актива равной нулю и requestImageDataForAsset возвращают информация по умолчанию объект.

+0

Решила ли ваша проблема полностью «не» получение нулевых активов? – WYS

1

У меня была проблема с подобными симптомами, где requestImageDataForAsset возвращаемые данные ноль изображения, но также сопровождается сообщением консоли ошибок, как это:

[Generic] Failed to load image data for asset <PHAsset: 0x13d041940> 87CCAFDC-A0E3-4AC9-AD1C-3F57B897A52E/L0/001 mediaType=1/0, sourceType=2, (113x124), creationDate=2015-06-29 04:56:34 +0000, location=0, hidden=0, favorite=0 with format 9999

В моем случае проблема вдруг происходит на конкретных устройство только с активами в iCloud разделяет альбомы после обновления с iOS 10.x до 11.0.3, а с тех пор до 11.2.5. Думаю, что, возможно, requestImageDataForAsset пытался использовать файлы, локально кэшированные в /var/mobile/Media/PhotoData/PhotoCloudSharingData/ (из ключа PHImageFileURLKey информационного словаря) и что кеш может быть поврежден. Я думал о том, как очистить этот кеш.

Toggling переключатель 'ICloud Photo Sharing' в Настройки IOS»-> Учетные записи & Пароли -> ICloud -> Фотографии кажется, сделали свое дело. requestImageDataForAsset теперь работает на те ранее неработающие активы.

Update 9 марта 2018

я могу воспроизвести эту проблему сейчас. Кажется, что это произошло после восстановления резервной копии из iTunes:

  1. Используйте приложение iOS и извлекайте фотографии из общего альбома iCloud.
  2. Резервное копирование устройства iOS с помощью iTunes.
  3. Восстановите резервную копию с помощью iTunes.
  4. Использование приложения снова для извлечения одних и тех же фотографий из общего альбома iCloud теперь не выполняется с помощью приведенного выше сообщения консоли.

Переключение переключателя «iCloud Photo Sharing» фиксирует его. Предположительно, процесс восстановления каким-то образом искажает некоторый кеш. Я сообщил об этом в качестве ошибки 38290463 для Apple.

+0

Но как вы говорите пользователю об этом? Было бы замечательно иметь решение для самого приложения. – d4Rk

+0

@ d4Rk Это хороший момент. Если приложение точно обнаружит эту ситуацию, а затем, возможно, направит пользователя на страницу поддержки, описывающую, как попытаться исправить проблему, было бы идеально. Точное обнаружение проблемы может быть сложным, хотя, поскольку все, что у вас действительно есть в приложении, является нулевым результатом, без какой-либо другой информации, чтобы различать другие возможные причины сбоя. – user2067021

Смежные вопросы