2013-03-07 7 views
7

Używam interfejsu API GoogleDrive w mojej aplikacji do przesyłania plików z mojej aplikacji. Do tej pory udało mi się znaleźć dobre wyniki dotyczące przesyłania wszystkich typów plików.Nigdy nie wysyłam postępu danych w Google API dla ios

Podążałem za Google example, aby przesłać pliki.

Próbuję pokazać postęp, w zależności od rozmiaru pliku, podczas przesyłania. Przeszedłem przez wiele klas w podanym przykładzie kodu google, ale nie ma zbyt wiele wyników.

Kroki następnie uzyskać postęp przesyłania plików:

Znalazłem poniżej metody w 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]; 
    } 
} 

Po tym jak w MyViewController.m pisemnej tym

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

}]; 

Powyżej NSLog nigdy się nie usprawiedliwia, dlatego nie mogę pobrać przesłanych bajtów danych. Przez debugowanie natrafiam na uploadProgressBlock_ zawsze wyświetlający zero. może to być rezonowane, a mój blokujący blok nie zostanie wykonany.

Proszę zasugerować, jeśli popełniłem jakikolwiek błąd, aby to rozwiązać. Jeśli ktoś ma pomysł na pobranie bajtów danych przesłanych do google drive dla pliku, proszę mnie zasugerować. Twoje sugestie są bardziej przydatne w mojej pracy.

Z góry dziękuję.

Skonsolidowane Odpowiedz przez biorąc nasze sugestie ludzi:

Oto kod, aby uzyskać informacje o postępie przesyłania

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]; 
     }]; 

Szczęśliwy Coding !!

+0

hi Ajay Potrzebuję waszej pomocy, mam zrobić integrację Google i I z powodzeniem przesłać plik audio do google Muszę pokazać pasek postępu podczas przesyłania pliku audio do google drive, jeśli wiesz o tej koncepcji, zasugeruj mi, jak mogę to zrobić? – Ravindhiran

+0

@Ravindhiran Proszę zobaczyć moje pytanie, które edytowałem i podałem kod odpowiedzi. – ajay

+0

+1 działa dobrze, dzięki ajay ... – Ravindhiran

Odpowiedz

8

Udało mi się użyć wywołania zwrotnego bloku upload ... przypisać go do obiektu GTLServiceTicket, który uzyskasz metodą executeQuery.

Próbka:

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 Witaj Fabiol, twoje rozwiązanie jest niesamowite. Działa – ajay

+0

bardzo ładnie, +1! – tipycalFlow

0

Podejrzewam, że może to mieć związek z brakiem zdefiniowanej w projekcie definicji. Jeśli tak, to zamiast używać -setUploadProgressBlock:, myślę, że trzeba zdefiniować metody jak:

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

a następnie określić je jako zwrotnego używać w kodzie, jak:

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

(Search dla uploadProgressSelector w GTLService.h; istnieje tam komentarz, który może być pomocny.)

+0

Próbowałem z selektorem również nadal nie ma z tym pożytku. – ajay

0

Niedawno używane odpowiedź FabioL, ale w Swift 2.3, to wygląda to

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

Jak przesłać Zdarza się aktualizuje ProgressView i po zakończeniu zmienia tytuł i przesłanie na UIAlertViewController

Powiązane problemy