0

Я изучаю Objective-C и стараюсь лучше понять GCD. Я создал объект (APICaller), который вызывает вызовы API, а затем предоставляет информацию его делегату. В методе делегата этого объекта (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) { 
    _staticCell.detailTextLabel.text = results; 
    } 

} 

... в то время как это обновляет клетка мгновенно:

- (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

Простой. Все обновления пользовательского интерфейса должны выполняться в основном потоке, а обработчик завершения не находится в основном потоке. – rmaddy

ответ

1

Обработчик показываемый в первом фрагменте кода не запускается в основном потоке и поэтому обновляется всякий раз, когда система решает, что обновление необходимо. Второй фрагмент использует GCD для явного запуска основного потока и, следовательно, немедленно обновляется.

+0

Ах. Достаточно просто. благодаря – Ja5onHoffman

Смежные вопросы