Не удается преобразовать UIImage в NSData при получении с помощью PhotoKit

Мой сценарий заключается в том, что я выбираю одну из фотографий, извлеченных из системного альбома с помощью 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 содержит данные, как показано ниже:

введите здесь описание изображения

Но NSData равно nil, как показано ниже:

введите здесь описание изображения

И что было ODD, так это то, что если бы я указал объект PHImageRequestOptions для PHImageManager для запроса изображений, NSData не был бы nil. Я не уверен, что изменилось с PHImageRequestOptions или без него и почему это имело бы такое значение.

ОБНОВЛЕНИЕ: Я обнаружил, что если вы укажете от PHImageRequestOptions до nil, то параметры по умолчанию заставят его получать фотографии асинхронно, что, на мой взгляд, может быть нестабильным для NSData, поэтому, когда я укажу options.synchronous = YES;, это будет работать.

Но в этом случае вызовет ли это какой-либо цикл сохранения или некоторые объекты PhotoKit не будут освобождены?


person Boris    schedule 10.09.2015    source источник


Ответы (1)


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

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

Это возвращает вам данные напрямую, но вам также придется сделать это синхронным. Это НЕ вызовет никаких циклов сохранения для любых объектов. Надеюсь это поможет. :)

person jarora    schedule 24.09.2015