7

我在我的应用程序中使用 GoogleDrive API 从我的应用程序上传文件。到目前为止,我成功并为上传所有类型的文件找到了很好的结果。

我按照谷歌示例上传文件。

我试图在上传时显示进度,具体取决于文件大小。我在谷歌给出的示例代码中经历了许多课程,但结果并不多。

获取文件上传进度的步骤:

我在 GTLServices.m 中找到了以下方法

- (void)setUploadProgressBlock:(GTLServiceUploadProgressBlock)block {
  [uploadProgressBlock_ autorelease];
  uploadProgressBlock_ = [block copy];

  if (uploadProgressBlock_) {
    // As above, we need the fetcher to call us back when bytes are sent.
    SEL sentDataSel = @selector(objectFetcher:didSendBytes:totalBytesSent:totalBytesExpectedToSend:);
    [[self objectFetcher] setSentDataSelector:sentDataSel];
  }
}

之后在 MyViewController.m 中这样写

 [self.driveService setUploadProgressBlock:^(GTLServiceTicket *ticket, unsigned long long numberOfBytesRead, unsigned long long dataLength) {
  NSLog(@"uploading");
 
}];

NSLog 以上永远不会因此而被原谅,因为我无法获取上传的数据字节。通过调试,我发现uploadProgressBlock_总是显示为零。这可能是我的块处理程序没有被执行的原因。

如果我有任何错误来解决它,请建议我。如果有人知道将数据字节上传到谷歌驱动器以获取文件,请建议我。你的建议对我的工作更有用。

提前致谢。

通过采纳我们的乡亲建议的综合答案:

这是获取上传进度信息的代码

GTLServiceTicket *uploadTicket= [self.driveService executeQuery:query completionHandler:^(GTLServiceTicket *ticket,GTLDriveFile *updatedFile,NSError *error)
        {
            if (error == nil)
            {
                [self.delegate completedFileUploadingToGoogleDrive];
                NSError *fileDeletionError=nil;
                [[NSFileManager defaultManager] removeItemAtPath:absalutePath error:&fileDeletionError];
            } else
            {
                [self.delegate errorOccoredWhileUploadingToGoogleDrive:error];
            }
        }];
        
        [uploadTicket setUploadProgressBlock:^(GTLServiceTicket *ticket, unsigned long long totalBytesWritten, unsigned long long totalBytesExpectedToWrite) {
            [self.delegate uploadedFileInfoInKB:(float)totalBytesExpectedToWrite/1024 and:(float)totalBytesWritten/1024];
        }];

编码快乐!!

4

3 回答 3

8

我已成功使用上传块回调...将其分配给GTLServiceTicket您从该executeQuery方法获得的对象。

样本:

GTLServiceTicket *uploadTicket =  [self.driveService executeQuery:query  completionHandler:^(GTLServiceTicket *ticket,  GTLDriveFile *insertedFile, NSError *error) 
                                           { // completion 
                                           }];


        [uploadTicket setUploadProgressBlock:^(GTLServiceTicket *ticket, unsigned long long totalBytesWritten, unsigned long long totalBytesExpectedToWrite) 
         {
             // progress
         }
于 2013-03-15T18:32:57.860 回答
1

我最近使用了 FabioL 的答案,但在 Swift 2.3 中,它看起来像这样

    let serviceTicket = service.executeQuery(query, completionHandler:  { (ticket, insertedFile , error) -> Void in
        let myFile = insertedFile as? GTLDriveFile

        if error == nil {
            alert.title = "Image Uploaded"
            alert.message = "100%"
            if progressView != nil {
                progressView!.progress = 1
            }
        } else {
            print("An Error Occurred! \(error)")
            alert.title = "There was an error uploading"
        }
    })

    //update UI on progress
    serviceTicket.uploadProgressBlock = {(ticket, written, total) in
        if progressView != nil {
            let progressCalc: Float = (Float(written)/Float(total))
            alert.message = "\(progressCalc*100)%"
            progressView!.progress = progressCalc
        }
    }

随着上传的发生,它会更新 ProgressView 并在完成时更改 UIAlertViewController 的标题和消息

于 2017-01-25T17:53:45.583 回答
0

我怀疑这可能与NS_BLOCKS_AVAILABLE您的项目中缺少#define 设置有关。-setUploadProgressBlock:如果是这样,那么我认为您需要定义一个方法,而不是 using :

        - (void)ticket:(GTLServiceTicket *)ticket
 hasDeliveredByteCount:(unsigned long long)numberOfBytesRead
      ofTotalByteCount:(unsigned long long)dataLength;

然后将其指定为要在代码中使用的回调,例如:

 [self.driveService setUploadProgressSelector:@selector(ticket:hasDeliveredByteCount:ofTotalByteCount:)];

uploadProgressSelector在 GTLService.h 中搜索;那里有一条可能有用的评论。)

于 2013-03-11T04:43:12.650 回答