Photos(PHFetchResultChangeDetails)

8887 ワード

Photos(PHChange)
Photos(PHObjectChangeDetails)
Photos(PHFetchResultChangeDetails)
PHFetchResultChangeDetailsは主にPHFetchResultの変動を記録するために用いられ、これにより複数のデータに変動があるか否かを同時に判断することができる.
1 PHFetchResultの取得
///    
public var fetchResultBeforeChanges: PHFetchResult { get }

///    
public var fetchResultAfterChanges: PHFetchResult { get }

2変更情報の取得
///      
public var hasIncrementalChanges: Bool { get }

///        
public var removedIndexes: NSIndexSet? { get }
///      
public var removedObjects: [PHObject] { get }

///        
public var insertedIndexes: NSIndexSet? { get }
///      
public var insertedObjects: [PHObject] { get }

///         
public var changedIndexes: NSIndexSet? { get }
///       
public var changedObjects: [PHObject] { get }

///     
public func enumerateMovesWithBlock(handler: (Int, Int) -> Void)

///      
public var hasMoves: Bool { get }

3 PHFetchResultの比較
///     PHFetchResult   
///
/// - parameter fromResult : PHFetchResult
/// - parameter toResult : PHFetchResult
/// - parameter changedObjects : [PHObject]
///
/// - returns: PHFetchResultChangeDetails
public convenience init(fromFetchResult fromResult: PHFetchResult, toFetchResult toResult: PHFetchResult, changedObjects: [PHObject])

4実戦演習
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()
            }
        }
    }
}

 
その他
ソースコード
Swift
参考資料
Photos Framework Reference
PHChange Class Reference
PHFetchResultChangeDetails Class Reference
ドキュメント変更レコード
時間
説明
2016-01-06
博文完成
著作権所有
CSDN:http://blog.csdn.net/y550918116j
GitHub:https://github.com/937447974/Blog