2015-10-05 19 views
5

Tôi đang sử dụng PHPhotoLibrary để lấy một vài bộ sưu tập ảnh như thế này:PHChange changeDetailsForFetchResult - luôn luôn trả về nil

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


Phương pháp analyzeCollectionInternal tiết kiệm PHAssetCollections để sử dụng sau và hiển thị các nội dung của bộ sưu tập.

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

    [...] 
} 


Ngoài ra tôi đã đăng ký một người quan sát sự thay đổi vào thư viện hình ảnh như thế này:

[[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self]; 


Các lớp hoạt động như Observer thực hiện các PHPhotoLibraryChangeObserver Nghị định thư như thế này:

- (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 ow nếu tôi mở ứng dụng Photos để Add/Change/Xóa ảnh khỏi "Tất cả hình ảnh" -SmartAlbum, Change-Observer được gọi, nhưng tiếng gọi của

[changeInstance changeDetailsForFetchResult:_smartAlbumsFetchResult] 

chỉ trả nil, ngay cả khi đối tượng PHChange chứa insertedObjectIDschangedObjectIDs. Điều tương tự cũng áp dụng khi chụp ảnh màn hình bằng cách sử dụng Home- và Lock-Button của iDevice.

+0

Hơi muộn một chút, nhưng bạn đã cố gắng gọi [PHAssetCollection fetchAssetCollectionsWithType: ...] với tùy chọn không phải là nil và với wantIncrementalChangeDetails = YES? – Ivan

Trả lời

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

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

+0

hãy xem [answer] – JimHawkins

Các vấn đề liên quan