2014-07-17 1 views
0

이 코드는 NSOutlineView에서 target-action 클릭으로 실행됩니다. 목표는 NSOutlineView에서 새 클릭을 통해 새 요청을 시작하기 전에 각 요청 (원래 웹 서비스 요청)을 완료하는 것입니다. 이 작동하지만 현재 비동기 호출이 끝날 때까지 UI가 세 번째 클릭에 응답하지 않게됩니다. 내가 누락 된 것?action-target 함수에서 runloop runmode를 사용하여 비동기 호출을 기다립니다.

- (void) showMarket:(NSString *)market sender:(id) sender { 

    do { 
     [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
    } while (loadingMarket); 

    loadingMarket = true; 

    NSLog(@"loading market %@", market); 
    [sender beginProgress:self]; 


    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     NSLog(@"loaded market %@", market); 
     [sender endProgress:self]; 
     loadingMarket = false; 
    }); 




} 

답변

1

동일한 currentRunLoop에서 currentRunLoop을 호출하는 것은 좋은 생각이 아닙니다. 나는 그것이 재진입 적이라고 생각하지 않는다. 직렬 작업에 직렬 디스패치 대기열을 사용하십시오. the Apple document을 살펴보십시오.