通过IOS Google Drive SDK列出Google云端硬盘中指定文件夹中的所有文件

时间:2013-01-30 11:58:03

标签: ios google-drive-api google-api-objc-client

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

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

首先获取指定父文件夹的子项,然后获取每个孩子的 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);
                                                }];
                    }
                }
            }];
    }

可能会感激的任何帮助。

2 个答案:

答案 0 :(得分:6)

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

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

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

到目前为止似乎运作良好。

答案 1 :(得分:2)

尝试在batch query中组合查询,例如

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:...]

如果启用了result pages的自动提取(service.shouldFetchNextPages = YES),则尝试设置查询的maxResults属性,以避免库需要进行多次提取。例如,如果查询的结果为100或更少,则maxResults值为100将使用单次提取来检索它们。

partial responses的请求也快一点,使用的内存要少得多,特别是对于大型结果。

请查看http logs,以便更好地了解查询的响应大小。