2

实际上,我将 google drive sdk 与我的 ios 应用程序集成在一起。我可以通过 google drive ios sdk 检索/上传 google drive 中的文件。但是从指定的父文件夹中检索文件列表需要花费很多时间。

这是我正在使用的步骤和代码。

首先获取指定父文件夹的子文件夹,然后获取每个子文件夹的GTLDriveChildReference,然后使用子引用标识符进行查询。

这对我来说是一个巨大的过程。它也每次都请求谷歌服务器。任何更好的方法都可以在查询中传递父文件夹 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

我一直在使用以下代码(只需要一个查询而不是多个查询):

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 将通过一次提取来检索它们。

对部分响应的请求也更快一些,并且使用更少的内存,特别是对于大型结果。

查看http 日志以更好地了解查询的响应大小。

于 2013-01-30T18:04:34.767 回答