Почему GCD заставляет этот код работать правильно?

Я изучаю Objective-C и пытаюсь лучше понять GCD. Я создал объект (APICaller), который выполняет вызовы API, а затем предоставляет информацию своему делегату. В методе (TableViewControllerA) viewDidLoad делегата этого объекта я вызываю один из методов APICaller, а затем использую информацию для обновления detailTextLabel.text двух статических ячеек. Мой вопрос: Почему, когда я использую dispatch_async, detailTextLabel.text обновляется намного быстрее, чем без него?

Это обновляет ячейку, но с большой задержкой:

- (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;
      });
  }

}

person Ja5onHoffman    schedule 30.10.2014    source источник
comment
Простой. Все обновления пользовательского интерфейса должны выполняться в основном потоке, а обработчик завершения не находится в основном потоке.   -  person rmaddy    schedule 30.10.2014


Ответы (1)


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

person reshat2    schedule 30.10.2014
comment
Ах. Достаточно просто. Спасибо - person Ja5onHoffman; 30.10.2014