Зачем использовать dispatch_async при использовании PerformSegueWithIdentifier в requestAccessToEntity:completion?

Когда я вызываю PerformSegueWithIdentifier в блоке завершения, если я не оборачиваю вызов в dispatch_async, для фактического перехода требуется буквально 10 секунд. Однако я могу делать другие вещи, не оборачивая их в один и тот же dispatch_async, например, выполнять работу с основными данными или регистрировать «вещи»…

Любое понимание того, как это работает и почему... Я потерян. Если это не то место, чтобы спросить что-то вроде этого, я извиняюсь.

EKEventStore *store = [[EKEventStore alloc] init];
[store requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) {
    dispatch_async(dispatch_get_main_queue(), ^{
        [self performSegueWithIdentifier:self.phaseSegue sender:self];
    });
}];

person crizzwald    schedule 11.03.2014    source источник
comment
У меня была проблема, когда переходная загрузка не срабатывала, пока пользователь не коснулся экрана, а не 10-секундной задержки, но в том же блоке завершения запроса доступа, что и вопрос. Обертывание его в dispatch_async в соответствии с вопросом решило эту проблему, и переход выполняется сразу.   -  person Adam Knights    schedule 16.04.2015


Ответы (1)


Из документация:

Когда пользователь нажимает, чтобы предоставить или запретить доступ, обработчик завершения будет вызван в произвольной очереди.

Кроме того, все, что связано с пользовательским интерфейсом, должно выполняться в основной очереди. Таким образом, вам нужно это dispatch_async.

person Marcelo Fabri    schedule 11.03.2014