Это может быть глупый вопрос, но мне нужно спросить и прояснить это для себя.
Чтобы отправить блок в очередь для выполнения, используйте функции dispatch_sync
и dispatch_async
. Они оба берут очередь и блок в качестве параметров. dispatch_async
возвращается немедленно, асинхронно запуская блок, а dispatch_sync
блокирует выполнение до тех пор, пока не будет возвращен предоставленный блок. Вот несколько ситуаций:
Ситуация 1
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_async(queue, ^{
[self goDoSomethingLongAndInvolved];
dispatch_async(queue, ^{
NSLog(@"this is statement1");
});
});
Ситуация 2
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_sync(queue, ^{
[self goDoSomethingLongAndInvolved];
dispatch_sync(queue, ^{
NSLog(@"this is statement1");
});
});
Ситуация 3
{
[super viewDidLoad];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_async(queue, ^{
[self goDoSomethingLongAndInvolved];
dispatch_sync(queue, ^{
NSLog(@"this is statement1");
});
});
Ситуация 4
{
[super viewDidLoad];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_sync(queue, ^{
[self goDoSomethingLongAndInvolved];
dispatch_async(queue, ^{
NSLog(@"this is statement1");
});
});
}
И goDoSomethingLongAndInvolved
есть
-(void)goDoSomethingLongAndInvolved {
NSLog(@"goDoSomethingLongAndInvolved");
}
Я попытался запустить их в Xcode, но я не вижу различий вообще.
Итак, мои вопросы:
- Какое основное различие между этими ситуациями?
- Что делать, если я заменил
queue
наdispatch_get_main_queue()
?