【问题标题】:Swift: Delete photo in iOS Action ExtensionSwift:在 iOS 操作扩展中删除照片
【发布时间】:2018-12-27 00:01:53
【问题描述】:

所以我正在开发一个应用程序,让用户在系统照片库中选择几张照片,然后通过共享表使用 Action Extension 删除其中一些照片。

我使用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 没有项目。

哪一部分出了问题?

【问题讨论】:

  • 动作扩展有什么用?如果您在自己的应用程序中,只需删除照片即可。如果您出现在其他人应用的活动视图中,您无法删除照片。

标签: ios swift ios-app-extension ios-extensions phphotolibrary


【解决方案1】:

几天来,我一直在努力找出发生了什么,但就我而言,事情似乎非常简单。事实上,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()
    }
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多