通过IOS Google Drive SDK在Google云端硬盘中列出指定文件夹中的所有文件
其实我整合了谷歌驱动器SDK与我的iOS应用程序。 我可以通过谷歌驱动器ios sdk检索/上传文件在谷歌驱动器。 但是从指定的父文件夹中检索文件列表需要很多时间。
这里的步骤和我正在使用的代码。
首先获取指定父文件夹的子项,然后获取每个子项的GTLDriveChildReference ,然后使用子项引用标识符查询。
对我来说这是一个巨大的过程。 也是每次都要求google服务器。 任何更好的方法只是在查询中传递父文件夹标识并从该父文件夹中提取文件。
-(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); }]; } } }]; }
任何帮助,可能会感激。
尝试在批处理查询中结合查询 ,如
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个或更less,则maxResults值为100将通过单个提取检索它们。
部分响应的请求也快一点,并且使用更less的内存,特别是对于大的结果。
查看http日志以更好地了解您的查询的响应大小。
我一直在使用下面的代码(只需要一个查询而不是多个查询):
GTLQueryDrive *query = [GTLQueryDrive queryForFilesList]; query.q = [NSString stringWithFormat:@"'%@' IN parents", <the folderID>]; [self.driveService executeQuery:query completionHandler:^(GTLServiceTicket *ticket, GTLDriveFileList *files, NSError *error) { ... }];
似乎到目前为止运作良好。