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?