PHChange changeDetailsForFetchResult - 总是返回nil

时间:2015-10-05 12:33:30

标签: ios objective-c photokit phasset phphotolibrary

我正在使用PHPhotoLibrary来检索这样的几个照片集:

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


充当Observer的类实现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];
        }
    });
}


现在,如果我打开照片应用程序添加/更改/删除“所有照片”-SmartAlbum中的照片,将调用Change-Observer,但调用

[changeInstance changeDetailsForFetchResult:_smartAlbumsFetchResult]

仅返回nil,即使PHChange对象包含insertedObjectIDschangedObjectIDs。使用iDevice的Home-和Lock-Button拍摄屏幕截图时也是如此。

1 个答案:

答案 0 :(得分: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]];