Spec-Zone .ru
спецификации, руководства, описания, API

Библиотека Разработчика iOS

Разработчик

Фото ссылка платформы ссылка на протокол PHPhotoLibraryChangeObserver

Опции
Развертывание Target:

На этой странице
Язык:

PHPhotoLibraryChangeObserver

Наследование


Не применимый

Соответствует


Оператор импорта


Swift

import Photos

Objective C

@import Photos;

Доступность


Доступный в iOS 8.0 и позже.

PHPhotoLibraryChangeObserver протокол уведомляет Вас относительно изменений, происходящих в фото библиотеке, независимо от того, внесены ли те изменения Вашим приложением пользователем в фото приложении, или другим приложением, использующим фото платформу. Для получения сообщений изменения зарегистрируйте наблюдателя в фото библиотеке registerChangeObserver: метод. Для любых активов или наборов, которые Вы выбираете, фотографии отправляют сообщения изменения каждый раз, когда изменяются те активы или наборы. Используйте этот протокол, чтобы отследить изменения через многократные части Вашего приложения или реагировать на изменения, сделанные в другом приложении или расширении.

Обработка изменений: пример

Перечисление 1 показывает, как Вы могли бы реализовать этот протокол в контроллере представления, использующем a UICollectionView взаимодействуйте через интерфейс для отображения содержания альбома. Контроллер представления сохраняет ссылку на PHAssetCollection объект, представляющий выведенный на экран альбом и PHFetchResult объект (возвращенный fetchAssetsInAssetCollection:options: метод) перечисление содержания альбома. Затем в photoLibraryDidChange: метод, контроллер представления проверяет на различия между объектами, которые это выбрало и новое состояние фото библиотеки и обновляет свое представление набора соответственно.

Фото библиотека перечисления 1Handling изменяется в представлении набора

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 и позже.