ios - ion thumbnail size
Fotos Framework requestImageDataForAsset falla ocasionalmente (3)
Es probable que esté iterando a través de una matriz, y la memoria no se libera a tiempo, puede probar el siguiente código. Asegúrese de que los datos theData
marcados con __block
.
@autoreleasepool {
[imageManager requestImageDataForAsset:asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
NSLog(@"requestImageDataForAsset returned info(%@)", info);
theData = [imageData copy];
}];
}
Estoy usando el marco de fotos en iOS8.1 y solicito los datos de imagen para el activo utilizando requestImageDataForAsset ... La mayoría de las veces funciona y obtengo los datos de imagen y un diccionario que contiene lo que ve a continuación. Pero a veces la llamada se completa, pero los datos son nulos y el diccionario contiene tres entradas de aspecto genérico.
Las llamadas se realizan secuencialmente y en el mismo hilo. No es específico de ninguna imagen en particular. El error ocurrirá en las imágenes que he abierto con éxito en el pasado. ¿Alguien ha encontrado esto?
+ (NSData *)retrieveAssetDataPhotosFramework:(NSURL *)urlMedia resolution:(CGFloat)resolution imageOrientation:(ALAssetOrientation*)imageOrientation {
__block NSData *iData = nil;
PHFetchResult *result = [PHAsset fetchAssetsWithALAssetURLs:@[urlMedia] options:nil];
PHAsset *asset = [result firstObject];
PHImageManager *imageManager = [PHImageManager defaultManager];
PHImageRequestOptions *options = [[PHImageRequestOptions alloc]init];
options.synchronous = YES;
options.version = PHImageRequestOptionsVersionCurrent;
@autoreleasepool {
[imageManager requestImageDataForAsset:asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
iData = [imageData copy];
NSLog(@"requestImageDataForAsset returned info(%@)", info);
*imageOrientation = (ALAssetOrientation)orientation;
}];
}
assert(iData.length != 0);
return iData;
}
Este es el resultado deseado donde obtengo datos de imagen y el diccionario de metadatos:
requestImageDataForAsset returned info({
PHImageFileDataKey = <PLXPCShMemData: 0x1702214a0> bufferLength=1753088 dataLength=1749524;
PHImageFileOrientationKey = 1;
PHImageFileSandboxExtensionTokenKey = "6e14948c4d0019fbb4d14cc5e021199f724f0323;00000000;00000000;000000000000001a;com.apple.app-sandbox.read;00000001;01000003;000000000009da80;/private/var/mobile/Media/DCIM/107APPLE/IMG_7258.JPG";
PHImageFileURLKey = "file:///var/mobile/Media/DCIM/107APPLE/IMG_7258.JPG";
PHImageFileUTIKey = "public.jpeg";
PHImageResultDeliveredImageFormatKey = 9999;
PHImageResultIsDegradedKey = 0;
PHImageResultIsInCloudKey = 0;
PHImageResultIsPlaceholderKey = 0;
PHImageResultWantedImageFormatKey = 9999;
})
Esto es lo que recibo de vez en cuando. Los datos de imagen son nulos. El diccionario no contiene tanto.
requestImageDataForAsset returned info({
PHImageResultDeliveredImageFormatKey = 9999;
PHImageResultIsDegradedKey = 0;
PHImageResultWantedImageFormatKey = 9999;
})
Tuve un problema con síntomas similares donde requestImageDataForAsset
devolvió datos de imagen nula pero también fue acompañado por un mensaje de error de consola como este:
[Generic] Failed to load image data for asset <PHAsset: 0x13d041940> 87CCAFDC-A0E3-4AC9-AD1C-3F57B897A52E/L0/001 mediaType=1/0, sourceType=2, (113x124), creationDate=2015-06-29 04:56:34 +0000, location=0, hidden=0, favorite=0 with format 9999
En mi caso, el problema comenzó repentinamente en un dispositivo específico solo con activos en álbumes compartidos de iCloud después de actualizar de iOS 10.x a 11.0.3, y desde entonces hasta 11.2.5. Pensando que quizás requestImageDataForAsset
intentaba usar archivos localmente almacenados en caché en /var/mobile/Media/PhotoData/PhotoCloudSharingData/
(de la clave PHImageFileURLKey
del diccionario de PHImageFileURLKey
) y que la memoria caché puede estar dañada, pensé en cómo limpiar esa memoria caché.
Al presionar el interruptor ''iCloud Photo Sharing'' en iOS '' Configuración -> Cuentas y contraseñas -> iCloud -> Las fotos parecen haber hecho el truco. requestImageDataForAsset
ahora está funcionando para aquellos activos que fallaron anteriormente.
Actualización del 9 de marzo de 2018.
Puedo reproducir este problema ahora. Parece que ocurre después de restaurar una copia de seguridad de iTunes:
- Use la aplicación iOS y recupere fotos de un álbum compartido de iCloud.
- Copia de seguridad del dispositivo iOS utilizando iTunes.
- Restaura la copia de seguridad utilizando iTunes.
- El uso de la aplicación nuevamente para recuperar las mismas fotos del álbum compartido de iCloud ahora falla con el mensaje de la consola anterior.
Conmutar el interruptor ''iCloud Photo Sharing'' lo arregla todavía. Presumiblemente, el proceso de restauración de alguna manera corrompe un poco de caché. Lo he reportado como Bug 38290463 a Apple.
Volviendo a esto después de un largo tiempo, he resuelto una gran parte de mi problema. Sin misterio, solo mal código:
PHFetchResult *result = [PHAsset fetchAssetsWithALAssetURLs:@[urlMedia] options:nil];
PHAsset *asset = [result firstObject];
if (asset != nil) { // the fix
PHImageManager *imageManager = [PHImageManager defaultManager];
PHImageRequestOptions *options = [[PHImageRequestOptions alloc]init];
...
}
La causa más común para mí fue un problema con la URL de medios pasada a fetchAssetsWithALAssetURLs
hace que el activo sea nulo y requestImageDataForAsset
devuelva un objeto de información predeterminado.