PHPhotoLibraryChangeObserver
Наследование
Не применимый
Оператор импорта
Swift
import Photos
Objective C
@import Photos;
Доступность
Доступный в iOS 8.0 и позже.
PHPhotoLibraryChangeObserver
протокол уведомляет Вас относительно изменений, происходящих в фото библиотеке, независимо от того, внесены ли те изменения Вашим приложением пользователем в фото приложении, или другим приложением, использующим фото платформу. Для получения сообщений изменения зарегистрируйте наблюдателя в фото библиотеке registerChangeObserver:
метод. Для любых активов или наборов, которые Вы выбираете, фотографии отправляют сообщения изменения каждый раз, когда изменяются те активы или наборы. Используйте этот протокол, чтобы отследить изменения через многократные части Вашего приложения или реагировать на изменения, сделанные в другом приложении или расширении.
Обработка изменений: пример
Перечисление 1 показывает, как Вы могли бы реализовать этот протокол в контроллере представления, использующем a UICollectionView
взаимодействуйте через интерфейс для отображения содержания альбома. Контроллер представления сохраняет ссылку на PHAssetCollection
объект, представляющий выведенный на экран альбом и PHFetchResult
объект (возвращенный fetchAssetsInAssetCollection:options:
метод) перечисление содержания альбома. Затем в photoLibraryDidChange:
метод, контроллер представления проверяет на различия между объектами, которые это выбрало и новое состояние фото библиотеки и обновляет свое представление набора соответственно.
Swift
func photoLibraryDidChange(changeInfo: PHChange!) {
// Photos may call this method on a background queue;
// switch to the main queue to update the UI.
dispatch_async(dispatch_get_main_queue()) {
// Check for changes to the displayed album itself
// (its existence and metadata, not its member assets).
if let albumChanges = changeInfo.changeDetailsForObject(self.displayedAlbum) {
// Fetch the new album and update the UI accordingly.
self.displayedAlbum = albumChanges.objectAfterChanges as PHAssetCollection
self.navigationController.navigationItem.title = self.displayedAlbum.localizedTitle
}
// Check for changes to the list of assets (insertions, deletions, moves, or updates).
if let collectionChanges = changeInfo.changeDetailsForFetchResult(self.assetsFetchResults) {
// Get the new fetch result for future change tracking.
self.assetsFetchResults = collectionChanges.fetchResultAfterChanges
if collectionChanges.hasIncrementalChanges {
// Get the changes as lists of index paths for updating the UI.
var removedPaths: [NSIndexPath]?
var insertedPaths: [NSIndexPath]?
var changedPaths: [NSIndexPath]?
if let removed = collectionChanges.removedIndexes {
removedPaths = self.indexPathsFromIndexSet(removed)
}
if let inserted = collectionChanges.insertedIndexes {
insertedPaths = self.indexPathsFromIndexSet(inserted)
}
if let changed = collectionChanges.changedIndexes {
changedPaths = self.indexPathsFromIndexSet(changed)
}
// Tell the collection view to animate insertions/deletions/moves
// and to refresh any cells that have changed content.
self.collectionView.performBatchUpdates(
{
if removedPaths {
self.collectionView.deleteItemsAtIndexPaths(removedPaths)
}
if insertedPaths {
self.collectionView.insertItemsAtIndexPaths(insertedPaths)
}
if changedPaths {
self.collectionView.reloadItemsAtIndexPaths(changedPaths)
}
if (collectionChanges.hasMoves) {
collectionChanges.enumerateMovesWithBlock() { fromIndex, toIndex in
let fromIndexPath = NSIndexPath(forItem: fromIndex, inSection: 0)
let toIndexPath = NSIndexPath(forItem: toIndex, inSection: 0)
self.collectionView.moveItemAtIndexPath(fromIndexPath, toIndexPath: toIndexPath)
}
}
}, completion: nil)
} else {
// Detailed change information is not available;
// repopulate the UI from the current fetch result.
self.collectionView.reloadData()
}
}
}
}
Objective C
- (void)photoLibraryDidChange:(PHChange *)changeInfo {
// Photos may call this method on a background queue;
// switch to the main queue to update the UI.
dispatch_async(dispatch_get_main_queue(), ^{
// Check for changes to the displayed album itself
// (its existence and metadata, not its member assets).
PHObjectChangeDetails *albumChanges = [changeInfo changeDetailsForObject:self.displayedAlbum];
if (albumChanges) {
// Fetch the new album and update the UI accordingly.
self.displayedAlbum = [albumChanges objectAfterChanges];
self.navigationController.navigationItem.title = self.displayedAlbum.localizedTitle;
}
// Check for changes to the list of assets (insertions, deletions, moves, or updates).
PHFetchResultChangeDetails *collectionChanges = [changeInfo changeDetailsForFetchResult:self.albumContents];
if (collectionChanges) {
// Get the new fetch result for future change tracking.
self.albumContents = collectionChanges.fetchResultAfterChanges;
if (collectionChanges.hasIncrementalChanges) {
// Tell the collection view to animate insertions/deletions/moves
// and to refresh any cells that have changed content.
[self.collectionView performBatchUpdates:^{
NSIndexSet *removed = collectionChanges.removedIndexes;
if (removed.count) {
[self.collectionView deleteItemsAtIndexPaths:[self indexPathsFromIndexSet:removed]];
}
NSIndexSet *inserted = collectionChanges.insertedIndexes;
if (inserted.count) {
[self.collectionView insertItemsAtIndexPaths:[self indexPathsFromIndexSet:inserted]];
}
NSIndexSet *changed = collectionChanges.changedIndexes;
if (changed.count) {
[self.collectionView reloadItemsAtIndexPaths:[self indexPathsFromIndexSet:changed]];
}
if (collectionChanges.hasMoves) {
[collectionChanges enumerateMovesWithBlock:^(NSUInteger fromIndex, NSUInteger toIndex) {
NSIndexPath *fromIndexPath = [NSIndexPath indexPathForItem:fromIndex inSection:0];
NSIndexPath *toIndexPath = [NSIndexPath indexPathForItem:toIndex inSection:0];
[self.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:toIndexPath];
}];
}
} completion:nil];
} else {
// Detailed change information is not available;
// repopulate the UI from the current fetch result.
[self.collectionView reloadData];
}
}
});
}
-
Говорит Вашему наблюдателю, что ряд изменений произошел в фото библиотеке. (требуемый)
Объявление
Swift
func photoLibraryDidChange(_
changeInstance
: PHChange!)Objective C
- (void)photoLibraryDidChange:(PHChange *)
changeInstance
Параметры
changeInstance
Объект, представляющий изменения.
Обсуждение
Используйте предоставленное
PHChange
объект узнать, которым, если таковые имеются, альбомов или наборов Вы интересуетесь, изменил и получает подробную информацию изменения. Вызовите объект измененияchangeDetailsForObject:
метод для получения информации об изменениях в содержании актива или свойствах метаданных или о свойствах метаданных набора. Вызовите объект измененияchangeDetailsForFetchResult:
получить информацию об изменениях в списке набора элементов (или к любому другому результату выборки).Фотографии вызывают этот метод на произвольной очереди. Если необходимо обновить UI приложения в результате изменения, диспетчеризируйте основной очереди.
Оператор импорта
Objective C
@import Photos;
Swift
import Photos
Доступность
Доступный в iOS 8.0 и позже.