文章出處:
http://www.cnblogs.com/YouXianMing/p/3659204.html
感謝@YouXianMing 的分享,其封裝的GCD工具能大大簡(jiǎn)化使用,下面是簡(jiǎn)單的用法介紹,詳情請(qǐng)戳上面鏈接查看:
1. 系統(tǒng)并發(fā)線程隊(duì)列
[[GCDQueue globalQueue] execute:^{
// 在系統(tǒng)默認(rèn)級(jí)別的線程隊(duì)列中執(zhí)行并發(fā)的操作
}];
實(shí)際上是在這個(gè)線程隊(duì)列中dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)執(zhí)行操作
這個(gè)并發(fā)隊(duì)列是不能更改的,所以,你調(diào)用方法dispatch_suspend,dispatch_resume以及dispatch_set_context等等,都是沒有效果的.被提交到這個(gè)線程隊(duì)列的block將會(huì)被并發(fā)的執(zhí)行,不存在先后順序.
2. 系統(tǒng)串行線程隊(duì)列
[[GCDQueue mainQueue] execute:^{
// 在系統(tǒng)主線程隊(duì)列中執(zhí)行串行操作
}];
主線程隊(duì)列是被系統(tǒng)自動(dòng)創(chuàng)建的,用來(lái)關(guān)聯(lián)上你的應(yīng)用的主線程.
As with the global concurrent queues, calls to dispatch_suspend, dispatch_resume, dispatch_set_context, and the like have no effect when used with queues returned by this function.
作為全局的并發(fā)隊(duì)列,調(diào)用dispatch_suspend,dispatch_resume,dispatch_set_context類似的方法都將無(wú)效.
只有上一個(gè)block執(zhí)行完畢了才會(huì)執(zhí)行下一個(gè)block
[[GCDQueue globalQueue] execute:^{
// 并發(fā)線程執(zhí)行阻塞操作
[[GCDQueue mainQueue] execute:^{
// 主線程更新UI
}];
}];
3. 在某個(gè)指定的隊(duì)列中執(zhí)行延時(shí)操作
[[GCDQueue globalQueue] execute:^{
// 延時(shí)3秒后執(zhí)行操作
} afterDelay:3 * NSEC_PER_SEC];
將一個(gè)要執(zhí)行的并設(shè)定了時(shí)間block插入隊(duì)列.
這個(gè)方法會(huì)等到指定的時(shí)間,異步的將block添加到指定的隊(duì)列中.
4. 在group中監(jiān)聽某些線程完成了,之后再執(zhí)行某個(gè)線程
GCDGroup *group = [GCDGroup new];
[[GCDQueue globalQueue] execute:^{
// 代碼
} inGroup:group];
[[GCDQueue globalQueue] execute:^{
// 代碼
} inGroup:group];
[[GCDQueue globalQueue] execute:^{
// 代碼
} inGroup:group];
[[GCDQueue globalQueue] notify:^{
// 監(jiān)聽group中的其他的任務(wù)完成后才會(huì)執(zhí)行到此處
} inGroup:group];
這個(gè)方法安排了一個(gè)通知用的block到這個(gè)指定的queue當(dāng)中,而當(dāng)所有與這個(gè)group相關(guān)聯(lián)的block都執(zhí)行完畢了,才會(huì)執(zhí)行這個(gè)通知的block.如果這個(gè)組空了,那這個(gè)通知用的block就會(huì)被立即的執(zhí)行.
5. 使用定時(shí)器
GCDTimer *timer = [[GCDTimer alloc] initInQueue:[GCDQueue globalQueue]];
[timer event:^{
// 每1秒執(zhí)行一次你的event
} timeInterval:1 * NSEC_PER_SEC];
[timer start];
注意:↓↓↓↓此定時(shí)器不能暫停,只能銷毀后釋放掉對(duì)象. ↓↓↓↓
[timer destroy];
[timer dispatchRelease];
6. 使用信號(hào)量
GCDSemaphore *sem = [[GCDSemaphore alloc] init];
GCDTimer *timer = [[GCDTimer alloc] initInQueue:[GCDQueue globalQueue]];
[timer event:^{
[sem signal];
} timeInterval:NSEC_PER_SEC];
[timer start];
[[GCDQueue globalQueue] execute:^{
while (1)
{
[sem wait];
NSLog(@"Y.X.");
}
}];
一個(gè)發(fā)送信號(hào),一個(gè)接受信號(hào)
發(fā)送信號(hào)增加一個(gè)信號(hào)量.
增加一個(gè)信號(hào)量,如果當(dāng)前值小于或者等于0,這個(gè)方法會(huì)喚醒某個(gè)使用了dispatch_semaphore_wait的線程.
如果這個(gè)線程已經(jīng)喚醒了,將會(huì)返回非0值,否則返回0