Azure Swift中Blob循环上传及上传完成触发Segue的实现方法
我来帮你搞定Azure Swift里Blob循环上传和上传完成触发Segue的问题,结合你给出的代码片段,给你整理一套可行的方案:
Azure Swift实现Blob循环上传及完成后触发Segue跳转方案
1. 循环上传Blob的核心实现
如果需要批量上传多个Blob(比如多张图片),关键是要跟踪所有异步上传任务的完成状态,这里推荐用DispatchGroup来管理,确保所有上传结束后再触发Segue。以下是完整代码示例:
// 假设你有一组待上传的图片数组 let imagesToUpload: [UIImage] = [/* 你的图片集合,比如从相册选择的图片 */] // 创建调度组,用来跟踪所有上传任务 let uploadGroup = DispatchGroup() do { // 初始化Azure存储账户 let account = try AZSCloudStorageAccount(fromConnectionString: azureAccessKey) let blobClient = account.getBlobClient() let blobContainer = blobClient.containerReference(fromName: containerName) // 先确保容器存在(如果你的容器已提前创建好,可跳过这步) uploadGroup.enter() blobContainer.createIfNotExists(with: nil, completionHandler: { error in if let error = error { print("容器创建失败:\(error.localizedDescription)") } uploadGroup.leave() }) // 等待容器准备完成后,开始批量上传图片 uploadGroup.notify(queue: .global()) { for (index, image) in imagesToUpload.enumerated() { uploadGroup.enter() // 将UIImage转为可上传的Data格式 guard let imageData = image.jpegData(compressionQuality: 0.8) else { print("第\(index+1)张图片转Data失败") uploadGroup.leave() continue } // 生成唯一文件名,避免覆盖已有Blob(用UUID保证唯一性) let imageName = "SampleList_\(index+1)_\(UUID().uuidString).jpg" let blob = blobContainer.blockBlobReference(fromName: imageName) // 执行异步上传操作 blob.upload(from: imageData, completionHandler: { error in // 不管上传成功还是失败,都标记当前任务完成 defer { uploadGroup.leave() } if let error = error { print("图片\(imageName)上传失败:\(error.localizedDescription)") } else { print("图片\(imageName)上传成功") } }) } // 所有上传任务完成后,回到主线程触发Segue uploadGroup.notify(queue: .main) { self.performSegue(withIdentifier: "YourSegueIdentifier", sender: self) } } } catch { print("初始化Azure存储账户失败:\(error.localizedDescription)") }
代码说明
DispatchGroup的enter()和leave()用来标记每个异步任务的开始与结束,确保我们能准确知道所有上传何时完成- 为每张图片生成唯一文件名,避免批量上传时覆盖已有Blob
- 所有UI操作(包括触发Segue)必须在主线程执行,所以用
DispatchQueue.main.async包裹Segue触发代码
2. 单个Blob上传完成触发Segue的简化写法
如果你只需要上传单个Blob,逻辑会更简单,直接在上传的回调里回到主线程触发Segue即可:
do { let account = try AZSCloudStorageAccount(fromConnectionString: azureAccessKey) let blobClient = account.getBlobClient() let blobContainer = blobClient.containerReference(fromName: containerName) let imageName = "SampleList.jpg" let blob = blobContainer.blockBlobReference(fromName: imageName) // 将目标图片转为Data guard let imageData = yourTargetImage.jpegData(compressionQuality: 0.8) else { print("图片转Data失败") return } // 执行异步上传 blob.upload(from: imageData, completionHandler: { error in DispatchQueue.main.async { if let error = error { print("上传失败:\(error.localizedDescription)") // 这里可以添加错误提示,比如弹出Alert告知用户 } else { // 上传成功,触发Segue跳转 self.performSegue(withIdentifier: "YourSegueIdentifier", sender: self) } } }) } catch { print("初始化存储账户失败:\(error.localizedDescription)") }
关键注意事项
- 主线程限制:Segue属于UI操作,必须在主线程执行,绝对不能在后台线程直接调用
performSegue - 错误处理:不要忽略上传过程中的错误(比如网络中断、权限不足),建议在错误时给用户明确提示
- 容器权限:确保你的Blob容器拥有足够的上传权限,或者连接字符串包含正确的账户密钥
内容的提问来源于stack exchange,提问作者Jov
相关产品推荐
相关产品推荐

