7

アプリケーションで GoogleDrive API を使用して、アプリケーションからファイルをアップロードしています。これまでのところ、すべてのタイプのファイルをアップロードするのに成功し、良い結果が得られました.

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

その後、このように書かれた MyViewController.m に

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

上記の NSLog は、アップロードされたデータ バイトを取得できないため、決して許されません。デバッグすると、uploadProgressBlock_が常に nil と表示されます。これは、私のブロック ハンドラが実行されないことに起因する可能性があります。

私がそれを解決するために間違いを犯した場合は、私に提案してください。ファイルのGoogleドライブにアップロードされたデータのバイトを取得するアイデアがある場合は、私に提案してください。あなたの提案は私の仕事にとってより有益です。

前もって感謝します。

私たちの人々の提案を取り入れて統合された回答:

アップロードの進行状況情報を取得するコードは次のとおりです

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

I have succeeded in using the upload block callback... assign it to the GTLServiceTicket object you obtain from the executeQuery method.

Sample:

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 に答える
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:)];

uploadProgressSelectorGTLService.hで検索してください。役立つコメントがあります。)

于 2013-03-11T04:43:12.650 に答える