2014-02-23 2 views
0

백그라운드에서 success 블록을 사용하고 싶습니다. 내가 UI를 업데이트 할 NSNotification을 보내AFNetworking 2.0 성공 블록 주 스레드

[manager POST:URLString parameters:params success:^(AFHTTPRequestOperation *responseHeader, id responseBody) { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{ 

    [self parseResponse:responseHeader and:responseBody forRequest:request]; 
    }); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"FAIL request: %@", error); 
}]; 

[self parseResponse:responseHeader and:responseBody forRequest:request]; 

에서 : 나는 코드를 사용합니다. 하지만 작동하지 않습니다 ... 왜?

+0

dispatch_async (dispatch_get_main_queue() ...) 메소드를 사용해보세요. – nerowolfe

답변

4

알림은 게시 할 때 동 기적으로 동일한 스레드에서 전송되므로 게시하기 전에 주 스레드로 다시 전환해야합니다 (콜백 수신 후 전환 할 수 있음).

dispatch_async 또는 performSelector:onMainThread:을 사용하여 주 스레드로 전환 할 수 있습니다.

0

UI 작업은 주 스레드에서 실행되어야합니다. 백그라운드 스레드에서 수행되는 경우 - 디버거에서 이에 대해 경고를 받게되며 몇 초 후 (UI 스레드가 실제로 호출을받을 때) 업데이트가 발생합니다. 이 때문에 주 스레드에 dispatch_async를 사용하여 주 스레드로 다시 팝핑하고 해당 스레드에서 모든 UI 작업을 수행해야합니다.

참고 - AFNetworking에서 - 어쨌든 다른 스레드에서 발생하는 비동기로드 작업이 있으며 완료 블록은 나가기 때와 동일한 큐에서 반환됩니다. 따라서 이론적으로 - UI 만 업데이트하면 귀하의 코드에서도 그것을 처리하지 말아야합니다.