Dlaczego wywołanie dispatch_sync () w głównej kolejce blokuje główną kolejkę?

Wiem, że to nie jest mocne pytanie, ale muszę wyjaśnić tę koncepcję.

ZdefiniowałemmyBlock następująco.

void(^myBlock)(void) = ^{
   for(int i = 0;i < 10 ; i++)
   {
       NSLog(@"%d and current queue = %@",i,[NSThread currentThread]);
   } 
};

Teraz wviewDidLoad metoda, gdy używamdispatch_sync() metoda niezależnie w głównej kolejce, a następnie kolejka główna zostaje zablokowana.

Oto próbka.

- (void)viewDidLoad
 {
    [super viewDidLoad];
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_sync(queue,myBlock);
 }

Ale Ale kiedy używam tego samegodispatch_sync() funkcja w głównym wątku Wewnątrz blokudispatch_async() funkcja, która jest uruchamiana w kolejce współbieżnej, wówczas wątek główny nie jest blokowany.

Oto próbka.

- (void)viewDidLoad
 {
    [super viewDidLoad];
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_async(queue,^{  

        dispatch_sync(dispatch_get_main_queue(),myBlock);
    });
 }

Nie wiem, dlaczego tak się dzieje? Dlaczego główny wątek został zablokowany podczas dzwonieniadispatch_sync() niezależnie?

questionAnswers(5)

yourAnswerToTheQuestion