【问题标题】:Cannot convert UIImage to NSData when fetched with PhotoKit使用 PhotoKit 获取时无法将 UIImage 转换为 NSData
【发布时间】:2015-12-06 08:46:30
【问题描述】:

我的场景是,我使用 PhotoKit 从系统相册中选择一张照片并在我的UICollectionView 中呈现,然后将选定的照片 (UIImage) 传递给我的下一张 UIView 并以表单形式将其发送到远程服务器的NSData。 但是当我在发送之前放置断点以跟踪NSData 时,我发现UIImage 有分配内存的数据,而NSData 没有。

这里是获取UIImage 的代码(请注意我没有指定任何PHImageRequestOptions 对象):

NSMutableArray *images = @[].mutableCopy;
PHImageManager *manager = [PHImageManager defaultManager];
PHAsset *asset = _photoPickerCollectionView.pickedAsset;
CGSize targetSize = CGSizeMake(asset.pixelWidth*0.5, asset.pixelHeight*0.5);
[manager requestImageForAsset:asset targetSize:targetSize contentMode:PHImageContentModeAspectFill options:nil resultHandler:^(UIImage *result, NSDictionary *info) {
    _nextView.pickedOne = result;
}];
[self.navigationController dismissViewControllerAnimated:YES completion:nil];

我将UIImage 转换为NSData,如下所示:

UIImage *image = _pickedOne;
NSData *imgData = UIImageJPEGRepresentation(image, imageQuality);

当我跟踪变量时,UIImage 包含如下数据:

NSDatanil 如下:

奇怪的是,如果我为PHImageManager 指定一个PHImageRequestOptions 对象来请求图像,那么NSData 就不会是nil。我不确定使用或不使用 PHImageRequestOptions 会发生什么变化以及为什么会产生如此大的差异。

更新: 我发现如果您将PHImageRequestOptions 指定为nil,那么默认选项将强制它异步获取照片,在我看来,这对于NSData 可能是不稳定的,所以当我指定options.synchronous = YES; 时它会起作用.

但在这种情况下,是否会导致任何保留循环或某些PhotoKit 对象不会被释放?

【问题讨论】:

    标签: ios objective-c uiimage nsdata photokit


    【解决方案1】:

    该方法默认是异步的。您需要设置选项以显式地使图像获取同步。我对这种转换的强烈建议是使用这个 API:

    - (PHImageRequestID)requestImageDataForAsset:(PHAsset *)asset options:(nullable PHImageRequestOptions *)options resultHandler:(void(^)(NSData *__nullable imageData, NSString *__nullable dataUTI, UIImageOrientation orientation, NSDictionary *__nullable info))resultHandler;
    

    这会直接向您返回数据,但您也必须使其同步。这不会导致任何对象的任何保留周期。 希望这可以帮助。 :)

    【讨论】:

      猜你喜欢
      • 2011-09-22
      • 2010-12-21
      • 2013-11-29
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      相关资源
      最近更新 更多