Dispatch Queues
- Serial Dispatch Queue
單線程模式讽坏,一個(gè)任務(wù)處理完才會(huì)執(zhí)行下一個(gè)任務(wù) - Concurrent Dispatch Queue
多線程處理夯接,不等待前一個(gè)線程結(jié)束就會(huì)開(kāi)始執(zhí)行下一個(gè)線程
Obtaining Dispatch Queues
有兩種方式可以創(chuàng)建Dispatch Queues:dispatch_queue_create
和 main dispatch queue / global dispatch queue
dispatch_queue_create
dispatch_queue_t serialQueue = dispatch_queue_create("mySerialQueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t concurrentQueue = dispatch_queue_create("myConcurrent", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(serialQueue, ^{
NSLog(@"Hello 1");
});
dispatch_async(serialQueue, ^{
NSLog(@"Hello 2");
});
dispatch_async(serialQueue, ^{
NSLog(@"Hello 3");
});
dispatch_async(concurrentQueue, ^{
NSLog(@"Hello 4");
});
dispatch_async(concurrentQueue, ^{
NSLog(@"Hello 5");
});
Main Dispatch Queue/Global Dispatch Queue
這兩個(gè)方法是用來(lái)獲得系統(tǒng)提供的Dispatch Queue谤逼。main dispatch queue是系統(tǒng)的主線程真仲,主線程是Serial dispatch queue。而Global Dispatch Queue是Concurrent dispatch queue痊土。Global Dispatch Queue有優(yōu)先級(jí)的設(shè)置
dispatch_queue_t globalHighQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_queue_t globalDefaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t globalLowQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
dispatch_queue_t globalBackGroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
dispatch_async(globalHighQueue, ^{
NSLog(@"high");
});
dispatch_async(globalDefaultQueue, ^{
NSLog(@"default");
});
dispatch_async(globalLowQueue, ^{
NSLog(@"low");
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"main");
});
});
dispatch_async(globalBackGroundQueue, ^{
NSLog(@"back");
});
Controlling Dispatch Queues(GCD API使用)
dispatch_set_target_queue
該方法用來(lái)變更一個(gè)創(chuàng)建好的dispatch queue的優(yōu)先級(jí)单旁,當(dāng)一個(gè)dispatch queue由dispatch_queue_create()創(chuàng)建時(shí),他們默認(rèn)為default priority巍沙。如果要更改就可以使用該方法
dispatch_queue_t globalQueue = dispatch_queue_create("test target", NULL);
dispatch_set_target_queue(globalQueue, globalHighQueue);
dispatch_after
該方法用來(lái)在queue里面設(shè)定開(kāi)始任務(wù)的時(shí)間
dispatch_async(globalHighQueue, ^{
NSLog(@"high");
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"high main");
});
});
Dispatch Group
全部任務(wù)結(jié)束的時(shí)候葵姥,可能需要做一些處理,利用group可以實(shí)現(xiàn)這個(gè)功能句携。
dispatch_group_t group = dispatch_group_create();//創(chuàng)建
dispatch_group_async(group, globalHighQueue, ^{ //添加
NSLog(@"high 1");
});
dispatch_group_async(group, globalHighQueue, ^{
NSLog(@"high 2");
});
dispatch_group_async(group, globalHighQueue, ^{
NSLog(@"high 3");
});
dispatch_group_notify(group,dispatch_get_main_queue(), ^{
NSLog(@"high end");
});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);//等待group運(yùn)行結(jié)束
dispatch_barrier_async
用來(lái)設(shè)置該任務(wù)完成之前完全占有線程榔幸,比如用來(lái)處理讀寫(xiě)沖突,當(dāng)寫(xiě)的時(shí)候矮嫉,讀線程必須等待削咆。(對(duì)于DISPATCH_QUEUE_CONCURRENT來(lái)說(shuō))
dispatch_async(concurrentQueue, ^{
NSLog(@"read 1");
});
dispatch_async(concurrentQueue, ^{
NSLog(@"read 2");
});
dispatch_barrier_async(concurrentQueue, ^{
NSLog(@"writing");
});
dispatch_async(concurrentQueue, ^{
NSLog(@"read 3");
});
dispatch_once
只執(zhí)行一次的API。
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"once");
});
dispatch_suspend/dispatch_resume
掛起和恢復(fù)
dispatch_suspend(queue);
dispatch_resume(queue);
dispatch_sync
dispatch_async是異步添加block不會(huì)阻塞線程蠢笋,而dispatch_sync是同步的會(huì)阻塞線程的運(yùn)行拨齐,如果當(dāng)前線程和要處理的block線程相同,就會(huì)產(chǎn)生死鎖昨寞。兩者從功能上是差不多的瞻惋。
dispatch_async(concurrentQueue, ^{
NSLog(@"read 1");
dispatch_sync(concurrentQueue, ^{
NSLog(@"線程阻塞--死鎖");
});
});
dispatch_apply
dispatch_apply與dispatch_sync函數(shù)和Dispatch Group相關(guān)聯(lián),該函數(shù)按照指定的次數(shù)將block追加到Dispatch Group中编矾,并等待執(zhí)行結(jié)束后返回。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(10, queue, ^(size_t index) {
NSLog(@"%zu", index); });
NSLog(@"done");
參考書(shū)籍
《Pro Multithreading and Memory Management for iOS and OS X》