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

Swift 3 实现Google Drive文件上传时显示进度条

给Google Drive上传添加上传进度条(Swift 3)

嘿,恭喜你的上传功能已经正常运行啦!要添加上传进度条其实很简单,Google的GTLRService框架已经内置了上传进度的监听机制,咱们直接改造你的代码就行:

步骤1:准备UI进度控件

首先在你的界面上添加一个UIProgressView(可以通过Storyboard拖入,或者代码创建),并创建对应的IBOutlet,比如命名为uploadProgressView,初始进度设为0。

步骤2:添加进度监听逻辑

GTLRService的请求票据(GTLRServiceTicket)提供了setUploadProgressBlock方法,我们可以用它来实时获取上传进度并更新UI。修改你的代码如下:

let folderId: String = folders[indexPath.row].folderId 
let metadata = GTLRDrive_File.init() 
metadata.name = "Ruin.mp3" 
metadata.parents = [folderId] 

guard let filePath = Bundle.main.path(forResource: "Ruin", ofType: "mp3") else { return } 
guard let fileData = FileManager.default.contents(atPath: filePath) else { return } 

let uploadParameters = GTLRUploadParameters(data: fileData , mimeType: "audio/mpeg") 
// 如果你上传的是大文件,建议把下面这行改成false,分块上传会让进度更平滑
uploadParameters.shouldUploadWithSingleRequest = true 

let query = GTLRDriveQuery_FilesCreate.query(withObject: metadata, uploadParameters: uploadParameters) 
query.fields = "id" 

// 执行请求并保存票据
let ticket = self.service.executeQuery(query, completionHandler: {(ticket:GTLRServiceTicket, object:Any?, error:Error?) in 
    if error == nil { 
        print("文件上传成功!")
        // 上传完成后重置进度条
        self.uploadProgressView.progress = 0
    } else { 
        print("上传出错:\(error!)")
        // 出错也重置进度条
        self.uploadProgressView.progress = 0
    } 
})

// 设置上传进度回调
ticket.setUploadProgressBlock { (ticket, bytesSent, totalBytesSent, totalBytesExpectedToSend) in
    // 进度回调在后台线程,必须切回主线程更新UI
    DispatchQueue.main.async {
        let progressRate = Float(totalBytesSent) / Float(totalBytesExpectedToSend)
        self.uploadProgressView.progress = progressRate
        // 可选:添加百分比标签显示
        // self.progressLabel.text = String(format: "上传进度:%.1f%%", progressRate * 100)
    }
}

关键注意点

  • UI更新必须在主线程:因为网络请求的回调是在后台线程执行的,直接更新UI会导致崩溃,所以一定要用DispatchQueue.main.async包裹UI更新代码。
  • 大文件建议分块上传:如果你的文件体积较大,把uploadParameters.shouldUploadWithSingleRequest设为false,这样框架会自动采用分块上传,进度回调的粒度会更细,用户能看到更平滑的进度变化。

这样就能实现实时显示上传进度的功能啦!

内容的提问来源于stack exchange,提问作者Bettaieb Amine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:24:14