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
相关产品推荐
相关产品推荐

