Ios XCode-在块完成时执行代码

Ios XCode-在块完成时执行代码,ios,ios7,block,Ios,Ios7,Block,所以我尝试使用ACAccountStore登录/注册用户。这是使用以模态方式显示的视图控制器实现的。这样工作很好,但是,当我关闭视图控制器时,底层/显示视图控制器仍然是一个黑色窗口。我假设会发生这种情况,因为我不会等待完成块完成 所以我的问题是:在调用[self dismissViewControllerAnimated:YES completion:nil]之前,如何等待完成块完成 -(void)loginWithTwitter{ ACAccountStore *account = [[AC

所以我尝试使用ACAccountStore登录/注册用户。这是使用以模态方式显示的视图控制器实现的。这样工作很好,但是,当我关闭视图控制器时,底层/显示视图控制器仍然是一个黑色窗口。我假设会发生这种情况,因为我不会等待完成块完成

所以我的问题是:在调用
[self dismissViewControllerAnimated:YES completion:nil]之前,如何等待完成块完成

-(void)loginWithTwitter{

ACAccountStore *account = [[ACAccountStore alloc] init];
ACAccountType *accountType = [account accountTypeWithAccountTypeIdentifier:
                              ACAccountTypeIdentifierTwitter];

[account requestAccessToAccountsWithType:accountType options:nil
                              completion:^(BOOL granted, NSError *error)
 {
     if (granted) {
         //do something -> call function to handle the data and dismiss the modal controller.
     }
     else{
        //fail and put our error message.
     }  
 }];
}

完成块是在主进程(本例中为账户访问请求)完成后执行的内容。因此,您可以将
[self dismissViewControllerAnimated:YES completion:nil]
放入其中

另一件事:在块中引用
self
是不好的,因为存在保留循环。您将修改代码,使其如下所示:

ACAccountStore *account = [[ACAccountStore alloc] init];
ACAccountType *accountType = [account accountTypeWithAccountTypeIdentifier:
        ACAccountTypeIdentifierTwitter];

__weak UIViewController *weakSelf = self;
[account requestAccessToAccountsWithType:accountType options:nil
                              completion:^(BOOL granted, NSError *error) {
    [weakSelf dismissViewControllerAnimated:YES completion:nil];

    if (granted) {
        //do something -> call function to handle the data and dismiss the modal controller.
    }
    else {
        //fail and put our error message.
    }

}];

你为什么不能把它放在后面?除非如此,如果您需要某种延迟,为什么不在延迟后使用执行选择器呢。虽然不漂亮,但这是人生。这“有效”——但并不能解决问题。这让我相信在呈现视图控制器出现之前的短暂“黑屏”与块无关。我认为底层视图控制器存在问题。你期望什么能取代黑屏?好吧,基本上是“常规”解雇ViewControlleranimated行为。ModalView向下滚动,显示底层屏幕。但是,是的,看起来这实际上是底层控制器的问题。