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
значение свойстваNO
false
. Используя эту выборку результат эквивалентен выполнению еще раз той же выборки, возвратившей исходный результат выборки.Оператор импорта
Objective C
@import Photos;
Swift
import Photos
Доступность
Доступный в iOS 8.0 и позже.
-
hasIncrementalChanges
СвойствоБулево значение, указывающее, могут ли изменения в результате выборки быть описаны инкрементно. (только для чтения)
Объявление
Swift
var hasIncrementalChanges: Bool { get }
Objective C
@property(atomic, assign, readonly) BOOL hasIncrementalChanges
Обсуждение
Если это значение
YES
true
, используйтеinsertedIndexes
,removedIndexes
, иchangedIndexes
свойства (илиinsertedObjects
,removedObjects
, иchangedObjects
свойства) для обнаружения, какие объекты в результате выборки были добавлены, удалило, или обновленный. Можно также использоватьhasMoves
свойство иenumerateMovesWithBlock:
метод для обнаружения, какие объекты в результате выборки были перестроены. Эти свойства могут быть полезны для обновления представления набора или подобного интерфейса, выводящего на экран содержание результата выборки.Если это значение
NO
false
, результат выборки слишком отличается от своего исходного состояния для инкрементной информации об изменении, чтобы быть значимым. Используйте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
значение свойстваNO
false
, значение этого свойства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
значение свойстваNO
false
, значение этого свойства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
значение свойстваNO
false
, значение этого свойства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
значение свойстваNO
false
, значение этого свойства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
значение свойстваNO
false
, значение этого свойства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
значение свойстваNO
false
, значение этого свойства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
Обсуждение
Если это значение
YES
true
, используйте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!(fromFetchResult
fromResult
: PHFetchResult!, toFetchResulttoResult
: PHFetchResult!, changedObjectschangedObjects
: [AnyObject]!)Objective C
+ (instancetype)changeDetailsFromFetchResult:(PHFetchResult *)
fromResult
toFetchResult:(PHFetchResult *)toResult
changedObjects:(NSArray *)changedObjects
Параметры
fromResult
Результат выборки, который будет обработан как «перед» состоянием в получающемся изменении, детализирует объект.
toResult
Результат выборки, который будет обработан как «после» состояния в получающемся изменении, детализирует объект.
changedObjects
Набор объектов вручную отметить, как изменено между двумя результатами выборки, или
nil
проигнорировать объектные изменения. Посмотрите обсуждение для подробных данных.Возвращаемое значение
Изменение детализирует объект.
Обсуждение
Как правило, Вы используете
PHChange
класс для полученияPHFetchResultChangeDetails
объекты, описывающие любые изменения, произошедшие, так как Вы выполнили выборку, но можно также использовать этот метод для получения изменения, детализируют объект, суммирующий различие между двумя произвольнымиPHFetchResult
объекты. В этом случае фотографии не могут автоматически определить, когда те же объекты присутствуют в обоих результатах выборки, но содержание тех объектов изменилось, таким образом,changedIndexes
иchangedObjects
свойства пусты.Однако можно использовать
changedObjects
параметр для ручного замечания объектов, как изменено. Например, рассмотрите контроллер представления, поддерживающий основной результат выборки, представляющий список альбомов и переходный набор, фильтрующий список согласно критериям поиска пользователя. Для этого потока операций Вы могли бы использовать метод как следующее:Swift
func filterFetchResult(fetchResult: PHFetchResult) -> PHFetchResult {
var filteredAlbums: [PHCollection] = []
fetchResult.enumerateObjectsUsingBlock { object, _, _ in
if 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.fetchResultAfterChanges
let 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.
let changedObjects = fetchResultChangeDetails.changedObjects
let 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 и позже.