如何在继续之前等待所有completionHandler块完成?

时间:2014-04-11 06:54:34

标签: ios concurrency google-drive-api objective-c-blocks

一直在使用Google Drive iOS SDK,并尝试构建文件夹内容列表,其中包括文件夹parent-folders&子文件夹。

Google Drive iOS SDK的功能非常简单,但考虑到下面的示例代码,如何在继续之前等待所有“ queryForFilesGetWithFileId ”completionHandler块完成?

原因是addFolderChildren添加了子文件夹&然后刷新视图,这显然需要最后完成。

GTLQueryDrive *query = [GTLQueryDrive queryForParentsListWithFileId:folderId];
[self.driveService executeQuery:query
              completionHandler:^(GTLServiceTicket *ticket,
                                  GTLDriveParentList *parents,
                                  NSError *error)
 {
     if (error == nil)
     {
         for (GTLDriveParentReference *parent in parents)
         {
             if ([parent.isRoot intValue] == 1)
             {
                 // add folder root -> "My Drive"
             }
             else
             {
                 GTLQueryDrive *query = [GTLQueryDrive queryForFilesGetWithFileId:parent.identifier];
                 [self.driveService executeQuery:query
                               completionHandler:^(GTLServiceTicket *ticket,
                                                   GTLDriveFile *file,
                                                   NSError *error)
                  {
                      if (error == nil)
                      {
                          // add folder parent -> file.title
                      }
                      else
                      {
                          [self handleFailed:error];
                      }
                  }];
             }
         }
         // add folder children
         // how do we wait here until all above queryForFilesGetWithFileId completionhandler blocks are done?
         [self addFolderChildren:folderId];
     }
     else
     {
         [self handleFailed:error];
     }
 }];

1 个答案:

答案 0 :(得分:0)

您可以将@protocol用于此

喜欢

@protocol MeuDelegate <NSObject>
@optional

-(void) meuEditingDone:(Meu*) meu;

@end


@interface EditMeu : MeuBasicViewController {

    id <MeuDelegate> delegate;
}


@property (retain) id delegate;

@end

并在.m文件中执行以下操作

@synthesize delegate;

在你的完成处理程序中调用这个方法,所以在那里你可以继续。