首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >照片框架requestImageDataForAsset偶尔会失败

照片框架requestImageDataForAsset偶尔会失败
EN

Stack Overflow用户
提问于 2015-01-27 20:22:29
回答 3查看 12.6K关注 0票数 21

我正在使用iOS8.1上的照片框架,并使用requestImageDataForAsset请求资产的图像数据……大多数情况下,它是有效的,我得到了图像数据和一个字典,其中包含您在下面看到的内容。但有时调用会完成,但数据为空,并且字典包含三个通用的查找条目。

这些调用是在同一线程上按顺序执行的。它不是特定于任何特定图像的。该错误将发生在我过去成功打开的图像上。有没有人遇到过这种情况?

代码语言:javascript
复制
+ (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;
}

这是我想要的结果,其中我得到了图像数据和元数据字典:

代码语言:javascript
复制
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;
})

这是我偶尔得到的。图像数据为零。字典中包含的内容就不多了。

代码语言:javascript
复制
requestImageDataForAsset returned info({
    PHImageResultDeliveredImageFormatKey = 9999;
    PHImageResultIsDegradedKey = 0;
    PHImageResultWantedImageFormatKey = 9999;
})
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-27 20:53:50

您可能正在迭代数组,而内存没有及时释放,您可以尝试下面的代码。确保__block标记了theData

代码语言:javascript
复制
@autoreleasepool {
    [imageManager requestImageDataForAsset:asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
        NSLog(@"requestImageDataForAsset returned info(%@)", info);
        theData = [imageData copy];
    }];
}
票数 2
EN

Stack Overflow用户

发布于 2016-12-07 10:32:10

过了很长一段时间,我又回到了这个问题上,我已经解决了大部分问题。没有什么神秘的,只是糟糕的代码:

代码语言:javascript
复制
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];
    ...
}

对我来说,最常见的原因是传递给fetchAssetsWithALAssetURLs的媒体URL有问题,导致asset为空,并且requestImageDataForAsset返回默认的info对象。

票数 0
EN

Stack Overflow用户

发布于 2019-11-04 09:41:20

下面的代码可能会有所帮助。我认为PHImageRequestOptions类有一个bug,所以我传递了nil,然后修复了这个bug。

代码语言:javascript
复制
   dispatch_semaphore_t sema = dispatch_semaphore_create(0);
            [[PHImageManager defaultManager] requestImageDataForAsset:asset options:nil resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
                assetModel.size = imageData.length;
                NSString *filename = [asset valueForKey:@"filename"];
                assetModel.fileName = filename;
                dispatch_semaphore_signal(sema);
            }];
            dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28170444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档