Не удается преобразовать 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 объекты не будут выпущены?

1 ответ

Решение

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

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

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

Другие вопросы по тегам