0

나는 Objective-C를 배우고 있으며 GCD를 더 잘 이해하려고 노력하고 있습니다. API 호출을 수행하는 객체 (APICaller)를 만든 다음 해당 델리게이트에 정보를 제공합니다. 이 개체의 대리자 (TableViewControllerA) viewDidLoad 메서드에서 APICaller 메서드 중 하나를 호출 한 다음이 정보를 사용하여 두 개의 정적 셀 detailTextLabel.text을 업데이트합니다. 내 질문 : 왜 dispatch_async을 사용할 때 detailTextLabel.text 업데이트가 없으면 훨씬 빨리 업데이트됩니까?GCD가이 코드를 올바르게 작동시키는 이유는 무엇입니까?

이 셀을 업데이트하지만 긴 지연 :

- (void)viewDidLoad 
{ 
    APICaller *apiCaller = [APICaller alloc] init]; 

    [apiCaller getInformationWithArgument:self.argument completionHandler:^(NSString *results, NSError *error) { 
    dispatch_async(dispatch_get_main_queue, ^(void) { 
      _staticCell.detailTextLabel.text = results; 
     }); 
    } 

} 
+4

간단합니다. 모든 UI 업데이트는 주 스레드에서 수행해야하며 완료 핸들러는 주 스레드에 있지 않아야합니다. – rmaddy

답변

1

첫 번째 코드 조각에 나타난 완료 핸들러가되지 않습니다 :

- (void)viewDidLoad 
{ 
    APICaller *apiCaller = [APICaller alloc] init]; 

    [apiCaller getInformationWithArgument:self.argument completionHandler:^(NSString *results, NSError *error) { 
    _staticCell.detailTextLabel.text = results; 
    } 

} 

...이 즉시 셀 업데이트하는 동안 주 스레드에서 실행되므로 시스템에서 업데이트가 필요하다고 결정할 때마다 업데이트됩니다. 두 번째 스 니펫은 GCD를 사용하여 주 스레드에서 명시 적으로 실행하므로 즉시 업데이트됩니다.

+0

아. 충분히 간단합니다. 감사 – Ja5onHoffman

관련 문제