2

実際、Google ドライブ SDK を iOS アプリに統合しました。Google ドライブ ios sdk を使用して、Google ドライブ内のファイルを取得/アップロードできます。しかし、指定された親フォルダーからファイル リストを取得するには、非常に時間がかかります。

ここで、私が使用していた手順とコードを示します。

最初に、指定された親フォルダーの子を取得してから、各子のGTLDriveChildReferenceを取得してから、子参照識別子を使用してクエリを実行しています。

これは私にとって大きなプロセスです。また、毎回Googleサーバーをリクエストします。クエリで親フォルダーIDを渡し、その親フォルダーからファイルをプルするだけのより良い方法があります。

   -(void)getFileListFromSpecifiedParentFolder {
        GTLQueryDrive *query2 = [GTLQueryDrive queryForChildrenListWithFolderId:<some_id or root>];
        query2.maxResults = 1000;

        // queryTicket can be used to track the status of the request.
        [self.driveService executeQuery:query2
            completionHandler:^(GTLServiceTicket *ticket,
                            GTLDriveChildList *children, NSError *error) {
                NSLog(@"\nGoogle Drive: file count in the folder: %d", children.items.count);
                //incase there is no files under this folder then we can avoid the fetching process
                if (!children.items.count) {
                    return ;
                }

                if (error == nil) {
                    for (GTLDriveChildReference *child in children) {

                        GTLQuery *query = [GTLQueryDrive queryForFilesGetWithFileId:child.identifier];

                        // queryTicket can be used to track the status of the request.
                        [self.driveService executeQuery:query
                            completionHandler:^(GTLServiceTicket *ticket,
                                                GTLDriveFile *file,
                                                NSError *error) {

                                                NSLog(@"\nfile name = %@", file.originalFilename);
                                                }];
                    }
                }
            }];
    }

いただければ幸いです。

4

2 に答える 2

6

私は次のコードを使用しています (複数のクエリではなく、1 つのクエリのみが必要です)。

GTLQueryDrive *query = [GTLQueryDrive queryForFilesList];
query.q = [NSString stringWithFormat:@"'%@' IN parents", <the folderID>];

[self.driveService executeQuery:query completionHandler:^(GTLServiceTicket *ticket,
                                                          GTLDriveFileList *files,
                                                          NSError *error) {
...
}];

これまでのところうまくいっているようです。

于 2013-05-05T23:04:56.187 に答える
2

のように、バッチ クエリでクエリを組み合わせてみてください。

GTLBatchQuery *batchQuery = [GTLBatchQuery batchQuery];
for (GTLDriveChildReference *child in children) {
  GTLQuery *query = [GTLQueryDrive queryForFilesGetWithFileId:child.identifier];
  query.completionBlock = ^(GTLServiceTicket *ticket, GTLDriveFile *file, NSError *error) {
    NSLog(@"error=%@, file name = %@", error, file.title);
  };
  [batchQuery addQuery:query];
}
[driveService executeQuery:batchQuery completionHandler:...]

結果ページの自動フェッチが有効になっている場合 ( service.shouldFetchNextPages = YES)、クエリの maxResults プロパティを設定して、ライブラリが複数のフェッチを行う必要がないようにしてください。たとえば、クエリの結果が 100 以下の場合、maxResults 値を 100 にすると、1 回のフェッチで結果が取得されます。

部分的な応答の要求も少し速くなり、特に大きな結果の場合に使用するメモリが大幅に少なくなります。

クエリの応答サイズをよりよく理解するには、http ログを参照してください。

于 2013-01-30T18:04:34.767 に答える