照片框架requestImageDataForAsset偶尔会失败

Dan*_*ney 20 objective-c ios photosframework

我在iOS8.1上使用照片框架并使用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;
}
Run Code Online (Sandbox Code Playgroud)

这是我获得图像数据和元数据字典的理想结果:

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;
})
Run Code Online (Sandbox Code Playgroud)

这是偶尔得到的.图像数据为零.字典包含的不是那么多.

requestImageDataForAsset returned info({
    PHImageResultDeliveredImageFormatKey = 9999;
    PHImageResultIsDegradedKey = 0;
    PHImageResultWantedImageFormatKey = 9999;
})
Run Code Online (Sandbox Code Playgroud)

use*_*021 5

我遇到了类似症状的问题,其中requestImageDataForAsset返回了nil图像数据,但是还伴随着这样的控制台错误消息:

[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

就我而言,从iOS 10.x升级到11.0.3,然后一直升级到11.2.5之后,问题突然开始在仅具有iCloud共享相册中资产的特定设备上发生。考虑到可能requestImageDataForAsset正在尝试使用本地缓存的文件/var/mobile/Media/PhotoData/PhotoCloudSharingData/(从信息字典的PHImageFileURLKey键),并且缓存可能已损坏,我想到了如何清除该缓存。

在iOS的“ 设置”->“帐户和密码”->“ iCloud”->“照片 ”中切换“ iCloud照片共享”开关似乎可以解决问题。requestImageDataForAsset现在正在为那些以前失败的资产工作。

更新2018年3月9日

我现在可以重现此问题。从iTunes还原备份后似乎会发生这种情况:

  1. 使用iOS应用并从iCloud共享相册中检索照片。
  2. 使用iTunes备份iOS设备。
  3. 使用iTunes还原备份。
  4. 现在,再次使用该应用程序从iCloud共享相册中检索相同的照片失败,并显示上述控制台消息。

切换“ iCloud照片共享”开关仍可以修复该问题。大概还原过程以某种方式破坏了某些缓存。我已将其报告为Bug 38290463。

  • @AhmadF这是链接:[https://bugreport.apple.com/web/?problemID=38290463](https://bugreport.apple.com/web/?problemID=38290463),但我不认为Apple的系统允许外部人员查看彼此的错误报告,因此我不确定它是否会有用。 (2认同)

gab*_*ler 2

您可能正在迭代数组,并且内存没有及时释放,您可以尝试以下代码。确保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];
    }];
}
Run Code Online (Sandbox Code Playgroud)

  • 这不是修复:我可以使用我的个人(iCloud 照片)库中的相同 4 个资源一致地重新创建此内容。该问题似乎是照片框架中的真正错误,或者是库中这些特定资产的某些问题。现在的问题是,什么是有效的解决方法。 (8认同)