最近有个需求,就是把 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 不是那么直观,但学会使用后,可以做一些很有意思的应用,比如查看任意时间的照片之类的。可以玩一玩。