PhotoLibraryの変更オブザーバを追加し、変更を受け取るために関連する機能を実装する必要があります。例えば :その後
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[[PHPhotoLibrary sharedPhotoLibrary] unregisterChangeObserver:self];
}
、プロトコルPHPhotoLibraryChangeObserverのdidChange方法を上書きします。
#pragma mark - <PHPhotoLibraryChangeObserver>
- (void)photoLibraryDidChange:(PHChange *)changeInstance
{
// Check if there are changes to the assets we are showing.
PHFetchResultChangeDetails *collectionChanges = [changeInstance changeDetailsForFetchResult:_fetchResult];
if (collectionChanges == nil) {
return;
}
// Get the new fetch result.
_fetchResult = [collectionChanges fetchResultAfterChanges];
/*
Change notifications may be made on a background queue. Re-dispatch to the
main queue before acting on the change as we'll be updating the UI.
*/
dispatch_async(dispatch_get_main_queue(), ^{
if (!_isCollectionViewLoaded) {
return ;
}
UICollectionView *collectionView = _collectionView;
if (![collectionChanges hasIncrementalChanges] || [collectionChanges hasMoves]) {
// Reload the collection view if the incremental diffs are not available
[collectionView reloadData];
} else {
/*
Tell the collection view to animate insertions and deletions if we
have incremental diffs.
*/
NSArray<NSIndexPath *> * removedPaths = [[collectionChanges removedIndexes] aapl_indexPathsFromIndexesWithSection:0];
NSArray<NSIndexPath *> * insertedPaths = [[collectionChanges insertedIndexes] aapl_indexPathsFromIndexesWithSection:0];
NSArray<NSIndexPath *> * changedPaths = [[collectionChanges changedIndexes] aapl_indexPathsFromIndexesWithSection:0];
BOOL shouldReload = NO;
if ((changedPaths != nil) + (removedPaths != nil) + (insertedPaths!= nil) > 1) {
shouldReload = YES;
}
if (shouldReload) {
[collectionView reloadData];
} else {
@try {
[collectionView performBatchUpdates:^{
if ([removedPaths count] > 0) {
[collectionView deleteItemsAtIndexPaths:removedPaths];
}
if ([insertedPaths count] > 0) {
[collectionView insertItemsAtIndexPaths:insertedPaths];
}
if ([changedPaths count] > 0) {
[collectionView reloadItemsAtIndexPaths:changedPaths];
}
} completion:^(BOOL finished) {
if (_fetchResult.count == 0) {
MTLog(@"There is no photo in this album yet!!!");
[self.navigationController popViewControllerAnimated:YES];
}
}];
}
@catch (NSException *exception) {
[collectionView reloadData];
}
}
}
});
}