dispatch_async ,dispatch_get_global_queue和 dispatch_get_main_queue的區(qū)別
dispatch_async 函數(shù)會(huì)將傳入的block塊放入指定的queue里運(yùn)行。這個(gè)函數(shù)是異步的,這就意味著它會(huì)立即返回而不管block是否運(yùn)行結(jié)束(在主隊(duì)列中除外,在主隊(duì)列中不會(huì)開啟新線程,會(huì)串行執(zhí)行任務(wù))。因此,我們可以在block里運(yùn)行各種耗時(shí)的操作(如網(wǎng)絡(luò)請求) 而同時(shí)不會(huì)阻塞UI線程。
dispatch_get_global_queue 會(huì)獲取一個(gè)全局隊(duì)列,我們姑且理解為系統(tǒng)為我們開啟的一些全局線程。我們用priority指定隊(duì)列的優(yōu)先級(jí),而flag作為保留字段備用(一般為0)。
dispatch_get_main_queue 會(huì)返回主隊(duì)列,也就是UI隊(duì)列。它一般用于在其它隊(duì)列中異步完成了一些工作后,需要在UI隊(duì)列中更新界面。
#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
- (void)viewDidLoad
{
[super viewDidLoad];
dispatch_async(kBgQueue, ^{
NSData* data = [NSData dataWithContentsOfURL: kLatestKivaLoansURL];
[self performSelectorOnMainThread:@selector(fetchedData:) withObject:datawaitUntilDone:YES];
})
}
dispatch_async 會(huì)向kBgQueue隊(duì)列中添加新的任務(wù)去執(zhí)行,這里kBgQueue隊(duì)列使用dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)獲得
datawaitUntilDone:這個(gè)參數(shù)設(shè)置為YES和NO的區(qū)別:
設(shè)置為YES:只有當(dāng)這個(gè)線程執(zhí)行完畢,才會(huì)接著往下執(zhí)行,否則一直等待
設(shè)置為NO:不管這個(gè)線程有沒有執(zhí)行完畢,都可以繼續(xù)往下執(zhí)行
Dispatch Queues
Dispatch Queues從使用的角度將更像另一種形式的Operation Queues, 只是 Operation Queuse是用Objective_C的Dispatch Queues是C的dispatch Queues有serial Queues 也被稱為私有dispatch Queues,一個(gè)時(shí)間只能運(yùn)行一個(gè)task,順序運(yùn)行dispatch_queue_t queue;
還有一種就是Concurrent Queues每個(gè)程序系統(tǒng)自動(dòng)提供了3個(gè)Concurrent Queue
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t aHQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_queue_t aLQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
啥意思一看就明白,3個(gè)優(yōu)先級(jí)別的concurrent queues
最后一個(gè)特殊的Dispatch Queue就是main dispatch Queue 也是程序啟動(dòng)自動(dòng)生成dispatch_queue_t mainQueue = dispatch_get_main_queue();
concurrent queues和main queue 都是由系統(tǒng)生成而且 dispatch_suspend, dispatch_resume, dispatch_set_context,這些函數(shù)對他們無效
但是我們的應(yīng)用不是簡單的同步也異步的運(yùn)行,應(yīng)用經(jīng)常是混合的
比如我們要task1 task2 task3 都運(yùn)行完成后才能異步運(yùn)行task4 task5 task6我們該怎么做呢?這里我們可以引入group的概念
dispatch_queue_t aDQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, aDQueue, ^{
NSLog(@"task 1 \n");
});
dispatch_group_async(group, aDQueue, ^{
NSLog(@"tast 2 \n");
});
dispatch_group_async(group, aDQueue, ^{
NSLog(@"tast 3 \n");
});
NSLog(@"please wait 1 2 3 \n");
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"task 1 2 3 finished \n");
group = dispatch_group_create();
dispatch_group_async(group, aDQueue, ^{
NSLog(@"task 4 \n");
});
dispatch_group_async(group, aDQueue, ^{
NSLog(@"task 5 \n");
});
dispatch_group_async(group, aDQueue, ^{
NSLog(@"task 6 \n");
});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"task 4 5 6 finished \n");