2012-12-21 2 views
3

필자는 정말 가벼운 ViewController를 가지고 있으며 viewDidLoad에서는 아무 것도 수행하지 않습니다. navigationController 위에이 뷰를 밀고 있습니다. 이 작업을 수행하는 메소드는 블록 내부에서 호출됩니다. showView를 호출 한 후 NSLog를 추가했는데 그 로그는 콘솔에 정말 빠르게 인쇄됩니다. 그러나보기가로드하는 데 많은 시간이 걸립니다 ... 나는 실제로 어떤 일이 일어날 지 이해하지 못합니다. 어떤 생각입니까 ???pushViewController 뷰를 표시하는 데 너무 많은 시간이 걸린다

ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error) { 
    [self showView]; 
    NSLog(@"EXECUTED");     
}); 

- (void) showView{ 
    TestViewController *test = [[TestViewController alloc]init]; 
    [self.navigationController pushViewController:test animated:NO]; 
} 
+0

'TestViewController'를 게시 할 수 있습니까? 여기에 무슨 일이 일어나고 있는지보기가 어렵습니다. – NSAddict

답변

9

: 완료 핸들러가 임의의 큐에 호출

. 응용 프로그램에서 응용 프로그램 전체에서 주소록을 사용하는 경우 해당 주소록의 모든 사용이 올바른 대기열에 안전하게 작동하도록 단일 대기열에 전달되도록해야합니다.

UI 코드가 주 스레드에서 호출되는지 확인해야합니다.

ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef error { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self showView]; 
     NSLog(@"EXECUTED");     
    }); 
}); 
+0

공백 만 있기 때문에 구문 강조를 수정해야합니다. – NSAddict

+0

@ NSAddict 감사합니다. – rmaddy

+0

감사합니다 @rmaddy 완벽하게 작동했습니다! 귀하의 답변 주셔서 감사합니다! – Andres

1

이 유일한 문제가되지 않을 수도 있지만 docs에 따라, 완료 핸들러는 임의의 큐에서 호출 ABAddressBookRequestAccessWithCompletion에 전달. -showViewUIViewController 개체를 처리하기 때문에 메인 큐에서 호출해야합니다.

또 다른 질문은 기본 대기열에서 다른 현상이 발생했는지 여부입니다. UI 업데이트를 차단할 수있는 다른 장기 실행 작업이 있습니까? ABAddressBookRequestAccessWithCompletion 용 문서에서

관련 문제