因此,我正在开发一个应用程序,使用户可以在系统照片库中选择几张照片,然后通过共享表使用动作扩展来删除其中一些照片。
我使用extensionContext.inputItems
来获取所选照片的URL:
let extensionItems = (self.extensionContext!.inputItems as! [NSExtensionItem]).first!
let attachments = extensionItems.attachments! as! [NSItemProvider]
for provider in attachments {
provider.loadItem(forTypeIdentifier: kUTTypeImage as String, options: nil) {
(imageURL, error) in
...
...
...
}
}
然后我使用PHAssetChangeRequest.deleteAssets
通过其URL删除照片
PHPhotoLibrary.shared().performChanges({
let imageAssetToDelete = PHAsset.fetchAssets(withALAssetURLs: imageURLs, options: nil)
PHAssetChangeRequest.deleteAssets(imageAssetToDelete)
}, completionHandler: {success, error in
if success {
print("success")
} else {
print(error!)
}
})
“成功”已打印到控制台,但不要求删除照片(未显示删除照片警报like this)
所以我检查了变量imageAssetToDelete
,但它显示:
<PHFetchResult: 0x28188b200> count=0
PHFetchResult
没有项目。
哪一部分出错了?
答案 0 :(得分:0)
我一直在努力寻找发生的事情,但就我而言,事情似乎非常简单。实际上,changeBlock
是异步调用的(在文档中有明确说明),而在我的代码中,带有资产的数组是在请求之后(实际上是在请求之前)清空的。代码:
PHPhotoLibrary.shared().performChanges({
// called when array is already empty
PHAssetChangeRequest.deleteAssets(self.assetsToDelete as NSArray)
})
// called first
assetsToDelete.removeAll()
所以我的解决方案是将.removeAll()
移至completionHandler
:
PHPhotoLibrary.shared().performChanges({
PHAssetChangeRequest.deleteAssets(self.assetsToDelete as NSArray)
}, completionHandler: { c, _ in
if c {
self.assetsToDelete.removeAll()
}
})