Photos.framework lanza <Error>: ImageIO: PNG zlib error pero aún proporciona UIImage

Encontré una pregunta similar aquí: iOS 8 (Swift) ¿Cómo me deshago de este error: ImageIO: error PNG zlib? sin embargo, hay algunas diferencias.

Recibo el PHAsset de un selector, donde la image se descarga y muestra correctamente (utiliza la class PHCachingImageManager ).

Pero, cuando trato de solicitar la image más adelante del Activo así:

 [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:AssetTargetSize contentMode:PHImageContentModeAspectFit options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) { if (result) _image = result; } 

la variable de result es un puntero a un object UIImage pero no es válido, no puedo convertirlo en NSData ni puedo ver rápidamente a través de xcode.

En el log, acabo de recibir el siguiente post: <Error>: ImageIO: PNG zlib error y nada más.

Traté de hacer la request síncrona como se sugiere en la pregunta vinculada, pero no hizo ninguna diferencia.

La image apuntada por el PHAsset se puede ver tanto en la aplicación Fotos como en el selector de fotos.

Necesitamos habilitar la opción síncrona.

 PHAsset *asset = array[i]; PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init]; options.synchronous = YES; PHImageManager *imageManager = [PHImageManager defaultManager]; [imageManager requestImageForAsset:asset targetSize:CGSizeMake(200, 200) contentMode:PHImageContentModeAspectFit options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) { badge = (UIImage *)result; }]; 

Resolví esto estableciendo las opciones sincrónicas antes mencionadas en verdadero, así como configurando el tamaño externamente a la llamada para solicitar ImageForAsset. Ambos fueron necesarios, para mí, para que funcione. En Swift 2. x :

  let aSize = CGFloat(200) // it's really a constant elsewhere in the project let targetSize = CGSizeMake(aSize, aSize) let options = PHImageRequestOptions() options.synchronous = true PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: targetSize, contentMode: .AspectFit, options: options, resultHandler: { (image, info) -> Void in guard let imageFor = image else { return } // use (now-unwrapped) imageFor here })