2015-10-05 286 views
5

我使用PHPhotoLibrary检索一些照片收藏是这样的:PHChange changeDetailsForFetchResult - 总是返回零

_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]; 
}]; 


的方法analyzeCollectionInternal保存PHAssetCollections供以后使用,并显示该集合的内容。

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

    [...] 
} 


此外,我注册了一个变化观测到的照片库中这样的:

[[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self]; 


充当观察者的类实现PHPhotoLibraryChangeObserver协议是这样的:

- (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]; 
     } 
    }); 
} 


N嗷嗷如果我打开照片应用添加/修改/从“所有照片” -SmartAlbum,更改观察者被调用,但

[changeInstance changeDetailsForFetchResult:_smartAlbumsFetchResult] 

只返回nil通话删除照片,即使PHChange对象包含insertedObjectIDschangedObjectIDs。使用iDevice的Home和Lock按钮进行屏幕截图时也是如此。

+0

有点迟了,但是您是否试图用非零选项和wantsIncrementalChangeDetails = YES调用[PHAssetCollection fetchAssetCollectionsWithType:...]? – Ivan

回答

0
@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.predicate = [NSPredicate predicateWithFormat:@"mediaType == %ld", PHAssetMediaTypeImage]; 
      break; 
     case PHAssetCollectionSubtypeSmartAlbumVideos: 
      options.predicate = [NSPredicate predicateWithFormat:@"mediaType == %ld", PHAssetMediaTypeVideo]; 
      break; 
     case PHAssetCollectionSubtypeSmartAlbumUserLibrary: 
      options.predicate = [NSPredicate predicateWithFormat:@"mediaType == %ld", PHAssetMediaTypeImage]; 
      break; 
     default: 
      options.predicate = [NSPredicate predicateWithFormat:@"mediaType == %ld || mediaType == %ld", PHAssetMediaTypeVideo,PHAssetMediaTypeImage]; 
      break; 
      break; 
    } 

    phFetchResult = [PHAsset fetchAssetsInAssetCollection:[self.assetCollectionsArray objectAtIndex:index] options:options]; 
} else { 
    phFetchResult = nil; 
} 

return phFetchResult; 
} 

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

+0

请看[答] – JimHawkins