如何在Swift中使用Amplify从AWS S3仅列出指定文件?
解决AWS Amplify Storage列出指定路径内容并批量删除的问题
1. 修改ListModel函数,支持指定路径筛选并返回结果
原ListModel函数没有参数,无法指定路径,且没有返回结果的机制。我们可以通过添加路径前缀参数和异步闭包回调来实现需求:
func listModel(withPrefix prefix: String, completion: @escaping (Result<[StorageItem], StorageError>) -> Void) { // 设置List请求的前缀参数,只列出该路径下的内容 let listOptions = StorageListRequest.Options(prefix: prefix) Amplify.Storage.list(options: listOptions) { event in switch event { case let .success(listResult): // 将筛选后的文件列表通过闭包返回 completion(.success(listResult.items)) case let .failure(storageError): completion(.failure(storageError)) } } }
调用示例
当用户选中某个项目后,传入其关联的S3路径前缀即可获取对应内容:
// 假设选中项目的关联路径是"user/456/attachments/" listModel(withPrefix: "user/456/attachments/") { result in switch result { case let .success(items): // 拿到指定路径下的所有文件key,执行批量删除 self.batchDeleteImages(with: items.map { $0.key }) case let .failure(error): print("获取指定路径内容失败:\(error.errorDescription). \(error.recoverySuggestion)") } }
2. 实现批量删除逻辑
基于你已有的deleteImage函数,我们可以通过循环调用完成批量删除;如果需要监听所有删除操作的完成状态,推荐使用DispatchGroup:
方式1:基础循环调用
直接复用原deleteImage函数:
func batchDeleteImages(with keys: [String]) { keys.forEach { key in deleteImage(key: key) } }
方式2:带完成通知的批量删除(推荐)
用DispatchGroup追踪所有删除操作,完成后执行后续逻辑(比如刷新UI):
func batchDeleteImages(with keys: [String]) { let deleteGroup = DispatchGroup() keys.forEach { key in deleteGroup.enter() Amplify.Storage.remove(key: key) { event in defer { deleteGroup.leave() } switch event { case let .success(deletedKey): print("已删除文件:\(deletedKey)") case let .failure(error): print("删除文件失败:\(error.errorDescription). \(error.recoverySuggestion)") } } } // 所有删除操作完成后触发 deleteGroup.notify(queue: .main) { print("全部文件删除完成") // 这里可以添加UI刷新、提示用户等逻辑 } }
3. 可选:优化deleteImage函数
如果需要在单个文件删除时通知调用方,可以给函数添加可选的闭包回调:
func deleteImage(key: String, completion: ((Result<String, StorageError>) -> Void)? = nil) { Amplify.Storage.remove(key: key) { event in switch event { case let .success(deletedKey): print("已删除文件:\(deletedKey)") completion?(.success(deletedKey)) case let .failure(error): print("删除文件失败:\(error.errorDescription). \(error.recoverySuggestion)") completion?(.failure(error)) } } }
内容的提问来源于stack exchange,提问作者Max Fritzhand
相关产品推荐
相关产品推荐

