0

Я просто попытался приведенный ниже кодПонимание ниже код

dispatch_async(dispatch_get_main_queue(), ^{ 
     [self taskB]; 
    }); 

[self performSelectorOnMainThread:@selector(taskA) withObject:nil waitUntilDone:NO]; 

Это taskA и taskB не выполняя NSLog и ничего другого. Теперь вот как taskB написан первым, но taskA выполняется в первую очередь. Даже я все еще меняю порядок performSelectorOnMainThread, выполнив сначала. И для каждого случая моя консоль показывает

2015-03-17 16:44:35.157 TestProject[9346:191978] Task A 
2015-03-17 16:44:35.283 TestProject[9346:191978] Task B 

Может кто-нибудь помочь мне понять, что здесь происходит. А почему performSelectorOnMainThread выполнить сначала?

ответ

2

Вы запускаете асинхронную задачу с dispatch_async, которая не гарантирует, что она будет выполнена немедленно.

Но с другой стороны, вы говорите вашей основной очереди (которая, как правило по умолчанию очереди на вашем жизненном цикле), который вы хотите, чтобы выполнить задачу A.

Поэтому, когда код выполняется блок будет пропущен асинхронно и продолжить выполнение задачи A. После завершения этой задачи задача B будет инициирована асинхронно.

3
dispatch_async(dispatch_get_main_queue(), ^{ 
     [self taskB]; 
    }); 

В этом коде вы используете dispatch_async, что говорит компилятор не остановить дальнейшее исполнение для кода, написанного в нем, так что компилятор продолжает выполнять performSelectorOnMainThread и после того, что компилятор думает о dispatch , Подробнее о Dispatch(GCD) here.