Не удается преобразовать 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;
Это вернет вам данные напрямую, но вы также должны сделать это синхронно. Это не приведет к сохранению циклов для каких-либо объектов. Надеюсь это поможет.:)