iOS - PhotosKit - 识别已修改资产的麻烦

时间:2017-12-11 09:29:37

标签: ios swift photosframework phphotolibrary

我正在使用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版本。

我有什么不对吗? 你认为我能以其他方式实现我的目标吗?

提前谢谢。

0 个答案:

没有答案