PHFetchResultChangeDetails
Оператор импорта
Swift
import Photos
Objective C
@import Photos;
Доступность
Доступный в iOS 8.0 и позже.
A PHFetchResultChangeDetails объект предоставляет подробную информацию о различиях между двумя результатами выборки — тот, который Вы ранее получили и обновленный, который закончился бы, если бы Вы выполнили ту же выборку снова. Подробный объект изменения предоставляет информацию, полезную для обновления UI, перечисляющего содержание результата выборки, такое как индексы добавленных, удаленных, и перестроенных объектов.
Отслеживание изменений
Как правило, Вы используете этот класс для отслеживания изменений в наборе (таких как альбом, момент или папка). Если Ваши отображения приложения элементы набора, Вы используете метод такой как fetchAssetsInAssetCollection:options: получить те элементы и затем сохранить получающееся PHFetchResult объект. Чтобы быть уведомленными относительно изменений в наборе, примите PHPhotoLibraryChangeObserver протокол и регистр Ваш наблюдатель с совместно используемым PHPhotoLibrary объект. Когда фотографии уведомят Вашего наблюдателя изменения, получите подробные данные изменения путем передачи более раннего результата выборки changeDetailsForFetchResult: метод.
Этот класс не описывает изменения в свойствах метаданных объекта — таких как заголовок набора — или содержание актива. Для такой информации передайте объект changeDetailsForObject: метод.
Можно также использовать changeDetailsFromFetchResult:toFetchResult:changedObjects: метод для получения подробной информации о различии между двумя произвольными результатами выборки.
Обработка изменений в порядке
Индексы, описанные изменением, детализируют объектное отражение определенный порядок операций — тот же порядок, который Вы используете для анимации изменений в UITableView и UICollectionView классы. Для корректного поддержания упорядочивания при обновлении интерфейса приложения для отражения изменений в результате выборки примените изменения в следующем порядке:
Удалите элементы в индексах, указанных
removedIndexesсвойство.Вставьте элементы в индексах, указанных
insertedIndexesсвойство.Элементы обновления, указанные
changedIndexesсвойство.Используйте
enumerateMovesWithBlock:метод для обработки элементов, расположения которых изменились.
-
fetchResultBeforeChangesСвойствоИсходный результат выборки, без недавних изменений. (только для чтения)
Объявление
Swift
var fetchResultBeforeChanges: PHFetchResult! { get }Objective C
@property(atomic, strong, readonly) PHFetchResult *fetchResultBeforeChangesОбсуждение
Значение этого свойства является тем же объектом, который Вы передали
changeDetailsForFetchResult:метод для запроса подробных данных изменения.Оператор импорта
Objective C
@import Photos;Swift
import PhotosДоступность
Доступный в iOS 8.0 и позже.
-
fetchResultAfterChangesСвойствоТекущий результат выборки, включая недавние изменения. (только для чтения)
Объявление
Swift
var fetchResultAfterChanges: PHFetchResult! { get }Objective C
@property(atomic, strong, readonly) PHFetchResult *fetchResultAfterChangesОбсуждение
Можно использовать этот объект проверить текущее состояние выбранных объектов даже если
hasIncrementalChangesзначение свойстваNOfalse. Используя эту выборку результат эквивалентен выполнению еще раз той же выборки, возвратившей исходный результат выборки.Оператор импорта
Objective C
@import Photos;Swift
import PhotosДоступность
Доступный в iOS 8.0 и позже.
-
hasIncrementalChangesСвойствоБулево значение, указывающее, могут ли изменения в результате выборки быть описаны инкрементно. (только для чтения)
Объявление
Swift
var hasIncrementalChanges: Bool { get }Objective C
@property(atomic, assign, readonly) BOOL hasIncrementalChangesОбсуждение
Если это значение
YEStrue, используйтеinsertedIndexes,removedIndexes, иchangedIndexesсвойства (илиinsertedObjects,removedObjects, иchangedObjectsсвойства) для обнаружения, какие объекты в результате выборки были добавлены, удалило, или обновленный. Можно также использоватьhasMovesсвойство иenumerateMovesWithBlock:метод для обнаружения, какие объекты в результате выборки были перестроены. Эти свойства могут быть полезны для обновления представления набора или подобного интерфейса, выводящего на экран содержание результата выборки.Если это значение
NOfalse, результат выборки слишком отличается от своего исходного состояния для инкрементной информации об изменении, чтобы быть значимым. ИспользуйтеfetchResultAfterChangesсвойство для получения текущего членства результата выборки. (При отображении содержания результата выборки перезагрузите пользовательский интерфейс для соответствия нового результата выборки.)Оператор импорта
Objective C
@import Photos;Swift
import PhotosДоступность
Доступный в iOS 8.0 и позже.
-
removedIndexesСвойствоИндексы, от которых объекты были удалены из результата выборки. (только для чтения)
Объявление
Swift
var removedIndexes: NSIndexSet! { get }Objective C
@property(atomic, strong, readonly) NSIndexSet *removedIndexesОбсуждение
Используйте этот индексный набор для удаления элементов из представления набора или подобного пользовательского интерфейса, выводящего на экран содержание результата выборки. Эти индексы относительно исходного результата выборки (
fetchResultBeforeChangesсвойство); при обновлении интерфейса приложения примените удаления перед вставками, изменениями и перемещениями.Если
hasIncrementalChangesзначение свойстваNOfalse, значение этого свойстваnil.Оператор импорта
Objective C
@import Photos;Swift
import PhotosДоступность
Доступный в iOS 8.0 и позже.
-
removedObjectsСвойствоЭлементы, удаленные из результата выборки. (только для чтения)
Объявление
Swift
var removedObjects: [AnyObject]! { get }Objective C
@property(atomic, strong, readonly) NSArray *removedObjectsОбсуждение
Этот массив может содержать
PHAsset,PHAssetCollection, илиPHCollectionListобъекты или некоторая комбинация этого.Если
hasIncrementalChangesзначение свойстваNOfalse, значение этого свойстваnil.Оператор импорта
Objective C
@import Photos;Swift
import PhotosДоступность
Доступный в iOS 8.0 и позже.
-
insertedIndexesСвойствоИндексы, где новые объекты были вставлены в результат выборки. (только для чтения)
Объявление
Swift
var insertedIndexes: NSIndexSet! { get }Objective C
@property(atomic, strong, readonly) NSIndexSet *insertedIndexesОбсуждение
Использование этот индексный набор может для вставки элементов в представление набора или подобный пользовательский интерфейс, выводящий на экран содержание результата выборки. Эти индексы относительно исходного результата выборки (
fetchResultBeforeChangesсвойство) после применения изменений, описанныхremovedIndexesсвойство; при обновлении интерфейса приложения примените вставки после удалений и перед изменениями и перемещениями.Если
hasIncrementalChangesзначение свойстваNOfalse, значение этого свойстваnil.Оператор импорта
Objective C
@import Photos;Swift
import PhotosДоступность
Доступный в iOS 8.0 и позже.
См. также
-
insertedObjectsСвойствоНовые элементы, вставленные в результат выборки. (только для чтения)
Объявление
Swift
var insertedObjects: [AnyObject]! { get }Objective C
@property(atomic, strong, readonly) NSArray *insertedObjectsОбсуждение
Этот массив может содержать
PHAsset,PHAssetCollection, илиPHCollectionListобъекты или некоторая комбинация этого.Если
hasIncrementalChangesзначение свойстваNOfalse, значение этого свойстваnil.Оператор импорта
Objective C
@import Photos;Swift
import PhotosДоступность
Доступный в iOS 8.0 и позже.
См. также
-
changedIndexesСвойствоИндексы объектов в выборке заканчиваются, чье содержание или метаданные были обновлены. (только для чтения)
Объявление
Swift
var changedIndexes: NSIndexSet! { get }Objective C
@property(atomic, strong, readonly) NSIndexSet *changedIndexesОбсуждение
Используйте этот индексный набор для обновления элементов в представлении набора или подобном пользовательском интерфейсе, выводящем на экран содержание результата выборки. Эти индексы относительно исходного результата выборки (
fetchResultBeforeChangesсвойство) после применения изменений, описанныхremovedIndexesиinsertedIndexesсвойства; при обновлении интерфейса приложения примените изменения после удалений и вставок и перед перемещениями.Если
hasIncrementalChangesзначение свойстваNOfalse, значение этого свойстваnil.Оператор импорта
Objective C
@import Photos;Swift
import PhotosДоступность
Доступный в iOS 8.0 и позже.
-
changedObjectsСвойствоОбъекты в выборке заканчиваются, чье содержание или метаданные были обновлены. (только для чтения)
Объявление
Swift
var changedObjects: [AnyObject]! { get }Objective C
@property(atomic, strong, readonly) NSArray *changedObjectsОбсуждение
Массив
PHAsset,PHAssetCollection, илиPHCollectionListобъекты.Если
hasIncrementalChangesзначение свойстваNOfalse, значение этого свойстваnil.Оператор импорта
Objective C
@import Photos;Swift
import PhotosДоступность
Доступный в iOS 8.0 и позже.
-
hasMovesСвойствоБулево значение, указывающее, были ли объекты перестроены в результате выборки. (только для чтения)
Объявление
Swift
var hasMoves: Bool { get }Objective C
@property(atomic, assign, readonly) BOOL hasMovesОбсуждение
Если это значение
YEStrue, используйтеenumerateMovesWithBlock:метод для обнаружения, какие элементы были перемещены и каковы их новые индексы.Оператор импорта
Objective C
@import Photos;Swift
import PhotosДоступность
Доступный в iOS 8.0 и позже.
-
Выполняет указанный блок для каждого случая, куда объект переместился от одного индекса до другого в результате выборки.
Объявление
Objective C
- (void)enumerateMovesWithBlock:(void (^)(NSUInteger fromIndex, NSUInteger toIndex))handlerПараметры
handlerБлок, который фотографии вызывают для предоставления подробной информации, о которой объекты в результате выборки переместились в который индексы.
Блок берет следующие параметры:
fromIndexИндекс объекта в исходном результате выборки.
toIndexИндекс, к которому объект переместился в новый результат выборки.
Обсуждение
toIndexпараметр вhandlerблок относительно состояния результата выборки после применения изменений, описанныхremovedIndexes,insertedIndexesиchangedIndexesсвойства. Поэтому при использовании этого метода, чтобы обновить представление набора или подобный пользовательский интерфейс, выводящий на экран содержание результата выборки, обновить UI для отражения вставок, удалений и изменений перед обработкой перемещений.Оператор импорта
Objective C
@import Photos;Swift
import PhotosДоступность
Доступный в iOS 8.0 и позже.
-
init (fromFetchResult:toFetchResult:changedObjects:) + changeDetailsFromFetchResult:toFetchResult:changedObjects:Создает подробный объект изменения, суммирующий различия между двумя результатами выборки.
Объявление
Swift
convenience init!(fromFetchResultfromResult: PHFetchResult!, toFetchResulttoResult: PHFetchResult!, changedObjectschangedObjects: [AnyObject]!)Objective C
+ (instancetype)changeDetailsFromFetchResult:(PHFetchResult *)fromResulttoFetchResult:(PHFetchResult *)toResultchangedObjects:(NSArray *)changedObjectsПараметры
fromResultРезультат выборки, который будет обработан как «перед» состоянием в получающемся изменении, детализирует объект.
toResultРезультат выборки, который будет обработан как «после» состояния в получающемся изменении, детализирует объект.
changedObjectsНабор объектов вручную отметить, как изменено между двумя результатами выборки, или
nilпроигнорировать объектные изменения. Посмотрите обсуждение для подробных данных.Возвращаемое значение
Изменение детализирует объект.
Обсуждение
Как правило, Вы используете
PHChangeкласс для полученияPHFetchResultChangeDetailsобъекты, описывающие любые изменения, произошедшие, так как Вы выполнили выборку, но можно также использовать этот метод для получения изменения, детализируют объект, суммирующий различие между двумя произвольнымиPHFetchResultобъекты. В этом случае фотографии не могут автоматически определить, когда те же объекты присутствуют в обоих результатах выборки, но содержание тех объектов изменилось, таким образом,changedIndexesиchangedObjectsсвойства пусты.Однако можно использовать
changedObjectsпараметр для ручного замечания объектов, как изменено. Например, рассмотрите контроллер представления, поддерживающий основной результат выборки, представляющий список альбомов и переходный набор, фильтрующий список согласно критериям поиска пользователя. Для этого потока операций Вы могли бы использовать метод как следующее:Swift
func filterFetchResult(fetchResult: PHFetchResult) -> PHFetchResult {var filteredAlbums: [PHCollection] = []fetchResult.enumerateObjectsUsingBlock { object, _, _ inif let collection = object as? PHCollection {if collection.localizedTitle.hasPrefix(self.searchBar.text) {filteredAlbums += [collection]}}}let filteredList = PHCollectionList.transientCollectionListWithCollections(filteredAlbums, title: nil)return PHCollection.fetchCollectionsInCollectionList(filteredList, options: nil)}
Objective C
- (PHFetchResult *)filterFetchResult:(PHFetchResult *)fetchResult{NSMutableArray *filteredAlbums = [NSMutableArray arrayWithCapacity:fetchResult.count];for (PHCollection *collection in fetchResult) {if ([collection.localizedTitle hasPrefix:self.searchBar.text]) {[filteredAlbums addObject:collection];}}PHCollectionList *filteredList = [PHCollectionList transientCollectionListWithCollections:filteredAlbums title:nil];return [PHCollection fetchCollectionsInCollectionList:filteredList options:nil];}
Поскольку переходные наборы не сохранены в фото библиотеке, фотографии не могут предоставить подробную информацию изменения для результатов выборки против переходного набора.
photoLibraryDidChange:метод предоставляет подробную информацию изменения для основного результата выборки, который можно использовать для запроса подробных данных изменения на отфильтрованный результат выборки:Swift
func photoLibraryDidChange(changeInstance: PHChange) {// This method may be called on a background queue; dispatch to the main queue to update the UI.dispatch_async(dispatch_get_main_queue()) {if let fetchResultChangeDetails = changeInstance.changeDetailsForFetchResult(self.baseFetchResult) {// Get the new base fetch result and filter it to get a new filtered result.self.baseFetchResult = fetchResultChangeDetails.fetchResultAfterChangeslet previousFilteredFetchResult = self.filteredFetchResultself.filteredFetchResult = self.filterFetchResult(self.baseFetchResult)// Get the changed objects between the original and new base fetches, and use them for marking changes between the filtered fetches.let changedObjects = fetchResultChangeDetails.changedObjectslet filteredChangeDetails: PHFetchResultChangeDetails? = PHFetchResultChangeDetails(fromFetchResult: previousFilteredFetchResult, toFetchResult: self.filteredFetchResult, changedObjects: changedObjects)// Use the filtered change details to update the UI.if filteredChangeDetails {self.updateViewForChangeDetails(filteredChangeDetails!)}}}}
Objective C
- (void)photoLibraryDidChange:(PHChange *)changeInstance{// This method may be called on a background queue; dispatch to the main queue to update the UI.dispatch_async(dispatch_get_main_queue(), ^{PHFetchResultChangeDetails *fetchResultChangeDetails = [changeInstance changeDetailsForFetchResult:self.baseFetchResult];if (fetchResultChangeDetails) {// Get the new base fetch result and filter it to get a new filtered result.self.baseFetchResult = fetchResultChangeDetails.fetchResultAfterChanges;PHFetchResult *previousFilteredFetchResult = self.filteredFetchResult;self.filteredFetchResult = [self filterFetchResult:self.baseFetchResult];// Get the changed objects between the original and new base fetches, and use them for marking changes between the filtered fetches.NSArray *changedObjects = [fetchResultChangeDetails changedObjects];PHFetchResultChangeDetails *filteredChangeDetails = [PHFetchResultChangeDetails changeDetailsFromFetchResult:previousFilteredFetchResult toFetchResult:self.filteredFetchResult changedObjects:changedObjects];// Use the filtered change details to update the UI.if (filteredChangeDetails) {[self updateViewForChangeDetails:filteredChangeDetails];}}});}
Поскольку Вы обеспечиваете
changedObjectsмассив от исходного изменения детализирует при вызовеchangeDetailsFromFetchResult:toFetchResult:changedObjects:метод, фотографии могут обеспечить включающую сводку различий между отфильтрованными результатами выборкиchangedIndexesиchangedObjectsинформация. Можно тогда использовать эту информацию для того, чтобы эффективно обновить интерфейс приложения — для примера того, как сделать это, посмотрите Ссылку на протокол PHPhotoLibraryChangeObserver.Оператор импорта
Objective C
@import Photos;Swift
import PhotosДоступность
Доступный в iOS 8.0 и позже.
