PHChange changeDetailsForFetchResult: siempre devuelve cero

Estoy usando PHPhotoLibrary para recuperar varias collections de fotos como esta:

 _smartAlbumsFetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumMyPhotoStream options:nil]; [_smartAlbumsFetchResult enumerateObjectsUsingBlock:^(PHAssetCollection *collection, NSUInteger idx, BOOL *stop) { [self analyzeCollectionInternal:collection]; }]; _userAlbumsFetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:userAlbumsOptions]; [_userAlbumsFetchResult enumerateObjectsUsingBlock:^(PHAssetCollection *collection, NSUInteger idx, BOOL *stop) { [self analyzeCollectionInternal:collection]; }]; 

El método analyzeCollectionInternal guarda los PHAssetCollections para su uso posterior y muestra el contenido de las collections.

 - (void)analyzeCollectionInternal:(PHAssetCollection *)collection { NSLog(@"Album Title %@", collection.localizedTitle); if (![_collections containsObject:collection]) { [_collections addObject:collection]; } [...] } 

Además, registré un cambio de observador en la biblioteca de fotos así:

 [[PHPhotoLibrary shanetworkingPhotoLibrary] registerChangeObserver:self]; 

La class que actúa como Observer implementa el protocolo PHPhotoLibraryChangeObserver así:

 - (void)photoLibraryDidChange:(PHChange *)changeInstance { dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"PicturesDataSource - photoLibraryDidChange"); NSMutableArray *collectionsToAnalyze = [NSMutableArray new]; NSMutableArray *collectionsToDelete = [NSMutableArray new]; if (_smartAlbumsFetchResult) { PHFetchResultChangeDetails *smartAlbumChanges = [changeInstance changeDetailsForFetchResult:_smartAlbumsFetchResult]; NSLog(@"PictureDataSource - changeDetailsForFetchResult(_smartAlbumsFetchResult): %@", smartAlbumChanges); if (smartAlbumChanges) { _smartAlbumsFetchResult = [smartAlbumChanges fetchResultAfterChanges]; [collectionsToAnalyze addObjectsFromArray:smartAlbumChanges.insertedObjects]; [collectionsToAnalyze addObjectsFromArray:smartAlbumChanges.changedObjects]; [collectionsToDelete addObjectsFromArray:smartAlbumChanges.removedObjects]; } } if (_userAlbumsFetchResult) { PHFetchResultChangeDetails *userAlbumChanges = [changeInstance changeDetailsForFetchResult:_userAlbumsFetchResult]; NSLog(@"PictureDataSource - changeDetailsForFetchResult(_userAlbumsFetchResult): %@", userAlbumChanges); if (userAlbumChanges) { _userAlbumsFetchResult = [userAlbumChanges fetchResultAfterChanges]; [collectionsToAnalyze addObjectsFromArray:userAlbumChanges.insertedObjects]; [collectionsToAnalyze addObjectsFromArray:userAlbumChanges.changedObjects]; [collectionsToDelete addObjectsFromArray:userAlbumChanges.removedObjects]; } } for (PHAssetCollection *collectionToAnalyze in collectionsToAnalyze) { [self analyzeCollection:collectionToAnalyze]; } for (PHAssetCollection *collectionToDelete in collectionsToDelete) { [self deleteCollection:collectionToDelete]; } }); } 

Ahora, si abro la aplicación Fotos para Agregar / Cambiar / Eliminar fotos de "Todas las fotos" -SmartAlbum, se invoca Change-Observer, pero la llamada de

 [changeInstance changeDetailsForFetchResult:_smartAlbumsFetchResult] 

solo devuelve nil , incluso si el object PHChange contiene changedObjectIDs y changedObjectIDs . Lo mismo se aplica cuando se toma una captura de pantalla utilizando el button de inicio y locking del iDevice.

 @property (nonatomic,strong) NSMutableArray *assetCollectionsArray; @property (nonatomic,strong) NSMutableArray *phAssetArray; -(void)initPHAssetData {self.assetCollectionsArray = [self updateAssetCollections]; self.phAssetArray = [[NSMutableArray alloc] init]; for (int i=0; i<[self.assetCollectionsArray count]; i++) { PHFetchResult *cFetchResult = [self updateFetchRequest:(int)i]; [self.phAssetArray addObject:cFetchResult]; } } - (NSMutableArray *)updateAssetCollections { NSArray *assetCollectionSubtypes = [NSArray arrayWithArray:self.phAssetSubTypeArray]; NSMutableDictionary *smartAlbums = [NSMutableDictionary dictionaryWithCapacity:assetCollectionSubtypes.count]; NSMutableArray *userAlbums = [NSMutableArray array]; PHFetchResult *smartAlbumsFetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAny options:nil]; PHFetchResult *userAlbums1 = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:nil]; NSArray *fetchResults = @[smartAlbumsFetchResult, userAlbums1]; for (PHFetchResult *fetchResult in fetchResults) { [fetchResult enumerateObjectsUsingBlock:^(PHAssetCollection *assetCollection, NSUInteger index, BOOL *stop) { PHAssetCollectionSubtype subtype = assetCollection.assetCollectionSubtype; if (subtype == PHAssetCollectionSubtypeAlbumRegular) { if ([assetCollectionSubtypes containsObject:@(subtype)]) [userAlbums addObject:assetCollection]; } else if ([assetCollectionSubtypes containsObject:@(subtype)]) { if (!smartAlbums[@(subtype)]) { smartAlbums[@(subtype)] = [NSMutableArray array]; } [smartAlbums[@(subtype)] addObject:assetCollection]; } }]; } NSMutableArray *assetCollections = [NSMutableArray array]; // Fetch smart albums for (NSNumber *assetCollectionSubtype in assetCollectionSubtypes) { NSArray *collections = smartAlbums[assetCollectionSubtype]; if (collections) { [assetCollections addObjectsFromArray:collections]; } } // Fetch user albums [userAlbums enumerateObjectsUsingBlock:^(PHAssetCollection *assetCollection, NSUInteger index, BOOL *stop) { [assetCollections addObject:assetCollection]; }]; return assetCollections; } - (PHFetchResult *)updateFetchRequest:(int)index { PHFetchResult *phFetchResult; if (self.assetCollectionsArray || [self.assetCollectionsArray count]>0) { PHFetchOptions *options = [PHFetchOptions new]; PHAssetCollection *assetCollection = [self.assetCollectionsArray objectAtIndex:index]; switch (assetCollection.assetCollectionSubtype) { case PHAssetCollectionSubtypeAlbumMyPhotoStream: options.pnetworkingicate = [NSPnetworkingicate pnetworkingicateWithFormat:@"mediaType == %ld", PHAssetMediaTypeImage]; break; case PHAssetCollectionSubtypeSmartAlbumVideos: options.pnetworkingicate = [NSPnetworkingicate pnetworkingicateWithFormat:@"mediaType == %ld", PHAssetMediaTypeVideo]; break; case PHAssetCollectionSubtypeSmartAlbumUserLibrary: options.pnetworkingicate = [NSPnetworkingicate pnetworkingicateWithFormat:@"mediaType == %ld", PHAssetMediaTypeImage]; break; default: options.pnetworkingicate = [NSPnetworkingicate pnetworkingicateWithFormat:@"mediaType == %ld || mediaType == %ld", PHAssetMediaTypeVideo,PHAssetMediaTypeImage]; break; break; } phFetchResult = [PHAsset fetchAssetsInAssetCollection:[self.assetCollectionsArray objectAtIndex:index] options:options]; } else { phFetchResult = nil; } return phFetchResult; } 

entonces: PHFetchResultChangeDetails * smartAlbumChanges = [changeInstance changeDetailsForFetchResult: [self.phAssetArray objectAtIndex: 0]];