You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:14:57