2013-03-07 73 views
7

我在我的應用程序中使用GoogleDrive API從我的應用程序上傳文件。到目前爲止,我成功地爲上傳所有類型的文件找到了很好的結果。永遠不會上傳數據在谷歌API ios的進度

我按照Google example上傳文件。

我想顯示進度,取決於文件大小,而上傳。我已經通過google中的很多類給出了示例代碼,但沒有太多結果。

遵循的步驟獲得文件上傳進度:

我發現下面的方法在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]; 
    } 
} 

之後,在這樣寫的

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

}]; 
MyViewController.m

上面的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]; 
     }]; 

編碼愉快!

+0

您好阿賈伊,我需要你的幫助的標題和消息,我已經做了谷歌的整合和我已成功上傳音頻文件到谷歌我需要顯示進度條,同時上傳音頻文件到谷歌驅動器,如果你知道這個概念,建議我如何做到這一點? – Ravindhiran 2013-08-27 08:04:01

+0

@Ravindhiran請看看我編輯過的問題,並給出答案的代碼。 – ajay 2013-08-27 10:02:39

+0

+1它的工作正常,謝謝阿賈伊... – Ravindhiran 2013-08-27 11:14:21

回答

8

我成功地使用了上傳塊回調...將它分配給您從executeQuery方法獲得的GTLServiceTicket對象。

樣品:

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 
     } 
+0

+1嗨Fabiol你的解決方案真棒。它的工作 – ajay 2013-03-18 05:16:25

+0

非常好,+1! – tipycalFlow 2013-06-03 07:29:09

0

我懷疑它可能與您的項目中缺少NS_BLOCKS_AVAILABLE #define設置有關。如果是這樣,那麼而是採用-setUploadProgressBlock:,我認爲你需要定義一個方法,如:

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

然後將其指定爲回調代碼中使用,如:

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

(搜索對於GTLService.h中的uploadProgressSelector;這裏有一條評論可能會有幫助。)

+0

我試着用選擇器也仍然沒有用它。 – ajay 2013-03-12 05:43:19

0

我最近使用FabioL的答案,但是在斯威夫特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

相關問題