3

私は本当に軽いViewControllerを持っています.viewDidLoadでは何もしません。このビューをナビゲーションコントローラーの上にプッシュしています。このアクションを実行するメソッドは、ブロック内から呼び出されます。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 に答える