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 insertedObjectIDs
và changedObjectIDs
. Đ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.
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