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