我正在使用Photos框架,特别是我想跟踪当前的相机胶卷状态,因此每次添加,删除或修改资源时都会更新它(主要是当用户编辑图片时 - 例如,添加过滤器,裁剪图像。
我的第一个实现类似于以下内容:
private var lastAssetFetchResult : PHFetchResult<PHAsset>?
func photoLibraryDidChange(_ changeInstance: PHChange) {
guard let fetchResult = lastAssetFetchResult,
let details = changeInstance.changeDetails(for: fetchResult) else {return}
let modified = details.changedObjects
let removed = details.removedObjects
let added = details.insertedObjects
// update fetch result
lastAssetFetchResult = details.fetchResultAfterChanges
// do stuff with modified, removed, added
}
但是,我很快发现details.changedObjects
不会只包含用户修改过的资产,所以我转到了以下实现:
let modified = modifiedAssets(changeInstance: changeInstance)
使用:
func modifiedAssets(changeInstance: PHChange) -> [PHAsset] {
var modified : [PHAsset] = []
lastAssetFetchResult?.enumerateObjects({ (obj, _, _) in
if let detail = changeInstance.changeDetails(for: obj) {
if detail.assetContentChanged {
if let updatedObj = detail.objectAfterChanges {
modified.append(updatedObj)
}
}
}
})
return modified
}
所以,依靠PHObjectChangeDetails.assetContentChanged
property,作为文档说明indicates whether the asset’s photo or video content has changed
。
这使得结果更接近我期待的结果,但是,我还没有完全理解它的行为。
在某些设备(例如iPad Mini 3)上,我在测试的所有情况下都得到了预期的结果(assetContentChanged = true),而在其他设备上(例如iPhone 6s Plus,iPhone 7),它几乎没有达到我的预期(assetContentChanged)即使是我裁剪或添加过滤器的资产也是假的。
所有设备共享最新的iOS 11.2版本。
我有什么不对吗? 你认为我能以其他方式实现我的目标吗?
提前谢谢。