ALAssetsLibrary: falla después de recibir ALAssetsLibraryChangedNotification

Parte de mi aplicación tiene un browser de fotos, algo similar a la aplicación Fotos de Apple, con un controller de vista inicial para examinar miniaturas de fotos y una vista de detalles que se muestra cuando tocas una foto.

Estoy usando ALAssetsLibrary para acceder a las fotos, y paso una matriz de direcciones URL de ALAsset a mi controller de vista de detalles para que puedas pasar de una foto a la siguiente.

Todo funciona muy bien, hasta que recibo un ALAssetsLibraryChangedNotification al pasar de una foto a otra (en el controller de vista de detalle), lo que a menudo resulta en un fallo:

NOTIFICACIÓN: la biblioteca de activos cambió // mi propio NSLog para cuando se produce la notificación

carga de activos … // mi NSLog para cuando comienzo a volver a cargar activos en el browser de miniaturas

Error de aserción: (tamaño == bytesRead), function – [ALAssetRepresentation _imageData], file /SourceCache/AssetsLibrary/MobileSlideShow-1373.58.1/Sources/ALAssetRepresentation.m, línea 224.

La línea específica de código en la que se cuelga, está en llamar a [metadatos currentRep] como se muestra aquí:

- (void)someMethod { NSURL *assetURL = [self.assetURLsArray objectAtIndex:index]; ALAsset *currentAsset; [self.assetsLibrary assetForURL:assetURL resultBlock:^(ALAsset *asset) { [self performSelectorInBackground:@selector(configureDetailViewForAsset:) withObject:asset]; } failureBlock:^(NSError *error) { NSLog(@"failed to retrieve asset: %@", error); }]; } - (void)configureDetailViewForAsset:(ALAsset *)currentAsset { ALAssetRepresentation *currentRep = [currentAsset defaultRepresentation]; if (currentAsset != nil) { // do some stuff } else { NSLog(@"ERROR: currentAsset is nil"); } NSDictionary *metaDictionary; if (currentRep != nil) { metaDictionary = [currentRep metadata]; // do some other stuff } else { NSLog(@"ERROR: currentRep is nil"); } } 

Entiendo que una vez que se recibe una notificación, invalida cualquier reference a los objects ALAsset y ALAssetRepresentation … pero ¿cómo se supone que debo hacer frente a la situación en la que invalida algo justo en medio de intentar acceder a ella?

He intentado configurar un BOOL, justo cuando recibo la notificación para abortar por completo y evitar que [los metadatos currentRep] se llamen, pero incluso eso no atrapa cada vez:

 if (self.receivedLibraryChangeNotification) { NSLog(@"received library change notification, need to abort"); } else { metaDictionary = [currentRep metadata]; } 

¿Hay algo que pueda hacer? En este punto, estoy casi listo para renunciar al uso del marco ALAssetsLibrary.

(tenga en count este hilo no resuelto en los foros de Apple dev que describen el mismo problema: https://devforums.apple.com/message/604430 )

Solutions Collecting From Web of "ALAssetsLibrary: falla después de recibir ALAssetsLibraryChangedNotification"

Parece que el problema está por aquí:

 [self.assetsLibrary assetForURL:nextURL resultBlock:^(ALAsset *asset) { // You should do some stuff with asset at this scope ALAssetRepresentation *currentRep = [asset defaultRepresentation]; // Assume we have a property for that self.assetRepresentationMetadata = [currentRep metadata]; ... // assume we have a method for that [self updateAssetDetailsView]; } failureBlock:^(NSError *error) { NSLog(@"failed to retrieve asset: %@", error); }]; 

Una vez que tenga el activo del usuario, es mejor copyr la información de los activos al proporcionar los datos necesarios a las subvenciones del controller de detalles o al almacenamiento en caching para su uso posterior. Puede ser útil para evitar los problemas de invalidation de ALAsset. Cuando se envía la notificación ALAssetsLibraryChangedNotification, es posible que necesite descartar el controller de detalles y consultar el contenido de la Biblioteca desde el principio.