2011-11-03 3 views
8

데이터가 포함 된 UITableViewController를로드하기 위해 트위터 계정 목록을 가져 오려고합니다. 나는이 기능을 사용 : 어떤 이유로(iOS 5) Twitter 계정 목록을 가져올 때 TableView가 중지됩니까?

- (void)viewDidLoad { 
    [accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) { 
     ... 
     [[self tableView] insertRowsAtIndexPaths ...]; 
     [[self tableView] reloadData]; 
     NSLog("This message appears immediately"); 
     ... 
    }]; 
    NSLog("This message appears immediately"); 
} 

을, 인터페이스는 실제로/다시 그려 업데이트되는 테이블 전에 5 초 동안 "중지"할 것 같다 (내가 reloadData를 부르고 있습니다!). 모든 로그 메시지가 즉시 인쇄되므로 인터페이스가 멈추는 원인이 무엇인지 확신 할 수 없습니다.

답변

16

모든,

그래서, (일종의)을 알아 냈다. 스레드와 관련이있는 것 같아요, 그 스레드에서 UI를 사용하지 않아야합니다.

그것을 해결하기 위해, 나는 약간 파견 코드 테이블 물건을 포위 :

[account requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) 
{ dispatch_async(dispatch_get_main_queue(), ^{ 
    ... 
});}]; 

아직도 여기 일어나고 있지만, 누군가가 같은 문제로 실행되면 희망이 도움이 될 것입니다 무엇을 이해할 필요가있다.

+0

메인 스레드에서 UI 호출이 발생해야하고,'-requestAccessToAccountsWithType : withCompletionHandler :'는 완료 블록이 메인 스레드에서 호출 될 것이라고 보장하지 않습니다. 'dispatch_async'의 사용은 올바른데, UI 호출 전에 더 많은 처리가 있다면'dispatch_async' 호출 전에 백그라운드 큐에서 자유롭게 처리 할 수 ​​있습니다. –

+0

감사원 님, 다른보기가 지연되어 동일한 문제가 발생했습니다. 이것은 나를 위해 그것을 해결했습니다. – thgc

+2

Apple의 샘플 코드는 performSelectorOnMainThread : withObject : waitUntilDone을 ​​사용합니다. 처리기 메서드가 임의의 큐에서 수행된다는 사실을 처리합니다. – sam