使用 Photos.framework 来批量删除 iOS 照片

技术 · 2018年10月31日 · 50 次阅读

最近有个需求,就是把 iPad Pro 上的照片全部清空。我既不想用手动删除的方式,也不想用导入到电脑然后再删除的方式,于是想用写代码的方式来解决问题这个问题。经过初步了解,可以使用 Photos.framework 来解决这个问题,这里是一些基本使用概括:

  • PHFetchOptions 用于描述需要获取的 Asset 的类型、数量、排序规则和查询条件;
  • 调用 PHAsset.fetchAssets 将 Asset 获取下来;
  • PHPhotoLibrary.shared().performChanges 的 Block 里面执行操作;
  • 最后调用 PHAssetChangeRequest.deleteAssets 进行真正的删除。

调用成功后,App 的界面会显示这么一条,以给用户最后的确认机会:

几点需要注意的地方:

  • 删除照片的 API 似乎没有进度汇报之类,所以一次性不要删除太多,不然会等很久;
  • 我遇到数据库出问题的情况,有些照片程序找不到,手动也删除不掉,这时,就只能把设备抹掉重装了。

下面是源码:

let count = 100
let options = PHFetchOptions()
options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
options.includeHiddenAssets = true
options.includeAllBurstAssets = true
options.includeAssetSourceTypes = [.typeCloudShared,
                                   .typeiTunesSynced,
                                   .typeUserLibrary]
options.fetchLimit = count

let fetchRequest = PHAsset.fetchAssets(with: options)

PHPhotoLibrary.shared().performChanges({
    var assets = [PHAsset]()

    fetchRequest.enumerateObjects({ (asset, _, _) in
        let canDelete = asset.canPerform(PHAssetEditOperation.delete)
        if canDelete {
            assets.append(asset)
        }
    })

    PHAssetChangeRequest.deleteAssets(assets as NSArray)
}) { (finished, error) in
    DispatchQueue.main.async {
         // Update your UI
    }
}

Photos.framework 的 API 不是那么直观,但学会使用后,可以做一些很有意思的应用,比如查看任意时间的照片之类的。可以玩一玩。

<推广> Manico 是一个专门为高效率人士设计的,macOS 平台下的 App 启动与切换工具,使用它将加倍电脑日常使用的效率。

No Comment

Leave a Comment

Click here to cancel reply.

Name (required)

Mail (will not be published) (required)

Website

Email me when someone replied

Submit Comment

如果您对美股 或者 港股也感兴趣, 或者想要了解如何开户, 可以加我wechat: xiaobei006006, 同时也可以拉您进美股交流群哦。
最后的最后 祝大家都有一个美好的投资生活哦。

大家也可以关注美股指南公众号, 会定期更新一些美股知识哦

写在最后

友情提示 转载请注明出处: https://investguider.com/topics/245
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册