2016-07-05 1 views
0

GoogleドライブAPIを使用してファイルとフォルダを取得しようとしています。IOS GoogleDrive API - 1回の実行でサブフォルダ内のすべてのファイルを取得する

- (void)fetchFilesFrom:(NSString *)folderID remoteFolderPath:(NSString *)folderPath { 

GTLQueryDrive *query = [GTLQueryDrive queryForFilesList]; 
query.q = [NSString stringWithFormat:@"'%@' IN parents", folderID]; // get all files and folders under a parent folder 
query.fields = @"nextPageToken, files(id, name, mimeType, modifiedTime)"; // get files' and folders' name and id only 

[self.serviceDrive executeQuery:query 
       completionHandler:^(GTLServiceTicket *ticket, 
            GTLDriveFileList *fileList, 
            NSError *error) { 
        if (error == nil) { 
         for (GTLDriveFile *file in fileList.files) { 
          if ([file.mimeType containsString:@"vnd.google-apps.folder"]) { // folder not file 
           NSString *subFolderPath = [NSString stringWithFormat:@"%@/%@", folderPath, file.name]; 
           [self.driveDict setValue:file forKey:subFolderPath]; 
           // Create the folder locally if not existing 
           [DocumentHandler checkToCreateDir:subFolderPath]; 
           // Fetch files in a subfolder 
           [self fetchFilesFrom:file.identifier remoteFolderPath:subFolderPath]; 
          }else if(![file.mimeType containsString:@"vnd.google-apps."]) { 
           // Ignore other google files like speadsheet... as they are undownloadable 
           NSString *filePath = [NSString stringWithFormat:@"%@/%@", folderPath, file.name]; 
           [self.driveDict setValue:file forKey:filePath]; 
          } 
         } 

        /* If possible, I want to have the full driveDict here in order to compare. */ 

        } else NSLog(@"An error occurred: %@", error); 
       }]; 

}

上記の機能が正常に動作しているが、私はサブフォルダ内のすべてのファイルを取得するには再帰ループを使用する必要はありません。元のファイルとそのサブフォルダ内のすべてのファイルを1回だけ実行する方法はありますか?

私は、ドライブファイルをダウンロードする前に、不要なローカルファイルを削除するために、ローカルファイルリストとリモートファイルのリストを比較したいと考えています。 executeQuery:completionHandler:^{}ブロックを使用すると、シリアル実行を正常に実装する方法が得られません。ブロック内のメソッドは、後で常に実行されます。詳しくは下記詳細な手順については

答えて

1

は、Googleドライブの公式サイト https://developers.google.com/drive/ios/quickstart

- (void)fetchFiles { 
    self.output.text = @"Getting files..."; 
    GTLQueryDrive *query = 
    [GTLQueryDrive queryForFilesList]; 
    //query.pageSize = 10; /* Total number of files to get at once But useful only when there are more than hundreds of file to get once.*/ 
    query.fields = @"nextPageToken, files(id, name)"; 
    [self.service executeQuery:query 
       delegate:self 
      didFinishSelector:@selector(displayResultWithTicket:finishedWithObject:error:)]; 
} 
+0

を使用することができます参照のためのリンクを提供する。リンクされたページが変更された場合、リンクのみの回答は無効になります。 – Marusyk

+0

私は実際にこのチュートリアルを何度も何度も読んでから質問を投稿しました。 – Tim

+0

もう一度転記した回答をチェックしてください。詳細なヘルプが必要な場合はお知らせください。私はあなたを歩いていくことができます。 –

0
- (void)fetchFiles { 
    self.output.text = @"Getting files..."; 
    GTLQueryDrive *query = 
    [GTLQueryDrive queryForFilesList]; 
    //query.pageSize = 10; /* Total number of files to get at once But useful only when there are more than hundreds of file to get once.*/ 
    query.fields = @"nextPageToken, files(id, name)"; 
    [self.service executeQuery:query 
       delegate:self 
      didFinishSelector:@selector(displayResultWithTicket:finishedWithObject:error:)]; 
} 

コールのすべてのファイルとフォルダのドライブにあるを取得するには、この方法のためのリンクです。すべてのフォルダ、そのサブフォルダを含むファイル、およびファイルを1回の呼び出しで一覧表示します。一言で言えば、ルートフォルダ内のすべて。

0

あなたの質問は私と同じです。このリンクは、ここで答えの重要な部分を含める方が良いです、質問に答えるかもしれないが、あなたはブロック:)

@property (nonatomic, copy) void(^blockHandler)(id data); 


// get list file 
- (void)listFiles:(NSString *)fileId complete:(void(^)(id data))completion { 
self.blockHandler = completion; 

GTLRDriveQuery_FilesList *query = [GTLRDriveQuery_FilesList query]; 
query.fields = @"nextPageToken, files(id, name, thumbnailLink, webViewLink)"; 
query.pageSize = 1000; 
query.q = [NSString stringWithFormat:@"'%@' In parents and trashed=false",fileId]; 

[self.service executeQuery:query 
        delegate:self 
     didFinishSelector:@selector(displayResultWithTicket:finishedWithObject:error:)]; 
} 

- (void)displayResultWithTicket:(GTLRServiceTicket *)ticket 
     finishedWithObject:(GTLRDrive_FileList *)result 
         error:(NSError *)error { 
if (error == nil) { 
    NSMutableString *output = [[NSMutableString alloc] init]; 
    if (result.files.count > 0) { 
     [output appendString:@"Files:\n"]; 
     for (GTLRDrive_File *file in result.files) { 
      itemGG *temp = [[itemGG alloc] initWithName:file.name linkThumb:file.thumbnailLink fileID:file.identifier]; 
      [self.lstItem addObject:temp]; 
      [output appendFormat:@"%@ (%@)\n", file.name, file.identifier]; 
     } 
    } else { 
     [output appendString:@"No files found."]; 
    } 
    NSLog(@"%@", output); 
} else { 
    NSLog(@"Error getting presentation data: %@\n", error.localizedDescription); 
} 

if (self.blockHandler) { 
    self.blockHandler([[NSArray alloc] initWithArray:self.lstItem]); 
} 
} 


__weak typeof(self) w = self; 
[self.cloud listFiles:@"root" complete:^(id data) { 
    w.tableData = data; 
    [w.myCollection reloadData]; 
}]; 
関連する問題