0

我的场景是,我使用 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];

我将其转换UIImageNSData

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

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

在此处输入图像描述

但是NSData如下nil

在此处输入图像描述

奇怪的是,如果我为请求图像指定一个PHImageRequestOptions对象,则不会是. 我不确定有没有改变了什么以及为什么会产生这样的差异。PHImageManagerNSDatanilPHImageRequestOptions

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

但在这种情况下,它会导致任何保留周期或某些PhotoKit对象不会被释放吗?

4

1 回答 1

0

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

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

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

于 2015-09-24T06:03:30.453 回答