Защо да използвате 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
Имах проблем, при който зареждането на segue не се задейства, докато потребителят не докосне екрана, вместо забавяне от 10 секунди, но в същия блок за завършване на искане на достъп като въпроса. Опаковането му в dispatch_async според въпроса разреши този проблем и преминаването се изпълнява веднага.   -  person Adam Knights    schedule 16.04.2015


Отговори (1)


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

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

Освен това всички неща, свързани с потребителския интерфейс, трябва да се правят на главната опашка. Ето защо имате нужда от това dispatch_async.

person Marcelo Fabri    schedule 11.03.2014