我有一个非常轻的ViewController,它在viewDidLoad中什么都不做。我在navigationController的顶部推动这个视图。执行此操作的方法是从块内部调用的。在调用showView后我添加了一个NSLog,并且该日志在控制台中打印速度非常快,但视图需要加载很多...我真的不明白可能发生的事情......任何想法???
ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) {
[self showView];
NSLog(@"EXECUTED");
});
- (void) showView{
TestViewController *test = [[TestViewController alloc]init];
[self.navigationController pushViewController:test animated:NO];
}
答案 0 :(得分:9)
来自ABAddressBookRequestAccessWithCompletion
的文档:
在任意队列上调用完成处理程序。如果您的应用在整个应用中使用地址簿,则您有责任确保将该地址簿的所有使用情况分发到单个队列,以确保正确的线程安全操作。
您应该确保在主线程上调用您的UI代码。
ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error {
dispatch_async(dispatch_get_main_queue(), ^{
[self showView];
NSLog(@"EXECUTED");
});
});
答案 1 :(得分:1)
这可能不是唯一的问题,但根据docs,传递给ABAddressBookRequestAccessWithCompletion
的完成处理程序在任意队列上调用。 -showView
只应在主队列上调用,因为它处理的是UIViewController
个对象。
要问的另一件事是主队列上还发生了什么?还有其他可能阻止UI更新的长期任务吗?