Я изучаю 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;
});
}
}
Простой. Все обновления пользовательского интерфейса должны выполняться в основном потоке, а обработчик завершения не находится в основном потоке. – rmaddy