3

我有一个很轻的 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];
}
4

2 回答 2

9

从文档中ABAddressBookRequestAccessWithCompletion

在任意队列上调用完成处理程序。如果您的应用程序在整个应用程序中使用地址簿,您有责任确保将该地址簿的所有使用分派到单个队列,以确保正确的线程安全操作。

您应该确保在主线程上调用您的 UI 代码。

ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error {
     dispatch_async(dispatch_get_main_queue(), ^{
         [self showView];
         NSLog(@"EXECUTED");                
     });
});
于 2012-12-21T20:47:37.983 回答
1

这可能不是唯一的问题,但根据docs,传递给的完成处理程序ABAddressBookRequestAccessWithCompletion在任意队列上被调用。-showView应该只在主队列上调用,因为它正在处理UIViewController对象。

要问的另一件事是主队列上还发生了什么?是否还有其他长期运行的任务可能会阻止 UI 更新?

于 2012-12-21T20:45:53.920 回答