¿Guardar un gran lote de fotos con el nuevo marco de fotos?

Estoy tratando de save un gran lote de fotos en la biblioteca de fotos utilizando la nueva class PHAssetChangeRequest en iOS 8. El problema es que parece que el daemon que guarda las fotos se bloquea inesperadamente con una cantidad moderadamente grande de fotos (I ' Estoy tratando de 500). ¿Alguien tiene alguna idea de cómo superar esta limitación? ¿Es un problema de uso de memory en el demonio en sí mismo? También podría ser un límite de time de espera en el bloque de cambios, porque entre las primeras 2 declaraciones de logging a continuación hay un espacio no insignificante.

¿No debería el demonio assetsd ya tener en count este caso de uso, ya que algo así es más o less lo que debería haber sido capaz de manejar el complejo model y layout en el nuevo marco de fotos? La muestra de documentation en sí muestra la capacidad de save una foto.

Aquí está mi ejemplo de código:

 [[PHPhotoLibrary shanetworkingPhotoLibrary] performChanges:^{ for (NSURL * url in fileURLs) { PHAssetChangeRequest * assetReq = [PHAssetChangeRequest creationRequestForAssetFromImageAtFileURL:url]; } NSLog(@"Added %d assets",fileURLs.count); } completionHandler:^(BOOL success, NSError *error) { if (!success){ NSLog(@"%@",error); } }]; 

Y así es como se ve mi salida:

 ... Added 501 assets ... Connection to assetsd was interrupted or assetsd died ... Error Domain=NSCocoaErrorDomain Code=-1 "The operation couldn't be completed. (Cocoa error -1.) 

Incluso probé el método síncrono performChangesAndWait en PHPhotoLibrary pero también tiene el mismo problema.

Estoy abierto a sugerencias / ideas, ¡estoy atrapado! Significado de la palabra

Procesando un gran lote de imágenes en el dispositivo, debes tener mucho cuidado con la gestión de la memory, incluso en los times modernos de ARC. Tuve una gran cantidad de imágenes para procesar (más de 50 con cambiar el tamaño) y terminé eligiendo el CGImageSourceCreateThumbnailAtIndex () tal como lo sugiere la respuesta aquí . Utiliza ImageIO que se supone que es muy eficiente. El único problema que me quedaba es que, por alguna razón, todavía se agarra a la memory a less que envuelva mi bucle forzado en un @autoreleasepool {}

 for (ALAsset *asset in assets) { @autoreleasepool { resizedImage = [self thumbnailForAsset:asset maxPixelSize:JPEG_MAX_DIMENSION]; // do stuff here } } 

en lugar de creationRequestForAssetFromImageAtFileURL , utilicé este método y funcionó perfecto para 10 imágenes (esta parte del código se repite en un tableView:cellForRowAtIndexPath:

  UIImage *thisImage=[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@",serverInfo,self.URLs[indexPath.row]]]]]; [[PHPhotoLibrary shanetworkingPhotoLibrary] performChanges:^{ PHAssetChangeRequest * assetReq = [PHAssetChangeRequest creationRequestForAssetFromImage:thisImage]; NSLog(@"Added %ld assets",(long)indexPath.row); } completionHandler:^(BOOL success, NSError *error) { if (!success){ NSLog(@"%@",error); } }]; 

Esto no es realmente una solución para esta pregunta, sin embargo, es una solución. Aún puede usar la antigua ALAssetsLibrary para save los files en la aplicación Camera Roll / Photos con éxito.

 ALAssetsLibrary* lib = [[ALAssetsLibrary alloc] init]; [lib writeImageDataToSavedPhotosAlbum:imageData metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) { // start saving your next image }]; 

También se recomienda usar una única instancia de AssetsLibrary cuando se repasan todas las fotos que desea save. Probablemente también desee esperar a que se complete la primera image guardada para comenzar a save la siguiente.

A continuación, puede convertir el assetURL resultante a un PHAset si es necesario:

 + (PHFetchResult *)fetchAssetsWithALAssetURLs:(NSArray *)assetURLs options:(PHFetchOptions *)options