GCD代碼記錄霞扬,以便后用
//自定義一個(gè)queue:
- (void)customQueue{
/*
第二個(gè)參數(shù)傳:
串行隊(duì)列:DISPATCH_QUEUE_SERIAL 開啟一個(gè)子線程页畦,按序執(zhí)行
并行隊(duì)列:DISPATCH_QUEUE_CONCURRENT 開啟多個(gè)子線程,無序執(zhí)行
同步:串行秀又、并行都會(huì)在主線程
異步:串行涮帘、并行都會(huì)在子線程
*/
//串行隊(duì)列
dispatch_queue_t serialQueue = dispatch_queue_create("com.gcd.serialQueue", DISPATCH_QUEUE_SERIAL);
//并發(fā)隊(duì)列
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.gcd.concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
//可以通過dispatch_queue_get_label(dispatch_queue_t queue)獲取你創(chuàng)建queue的名字
const char *c = dispatch_queue_get_label(concurrentQueue);
NSLog(@"%s",c);//com.gcd.concurrentQueue
dispatch_sync(concurrentQueue, ^{
NSLog(@"1");
[NSThread sleepForTimeInterval:2];
NSLog(@"1--");
});
dispatch_sync(concurrentQueue, ^{
NSLog(@"2");
[NSThread sleepForTimeInterval:2];
NSLog(@"2--");
});
dispatch_sync(concurrentQueue, ^{
NSLog(@"3");
[NSThread sleepForTimeInterval:4];
NSLog(@"3--");
});
dispatch_sync(concurrentQueue, ^{
NSLog(@"4");
[NSThread sleepForTimeInterval:2];
NSLog(@"4--");
});
}
dispatch_group
/*
串行隊(duì)列:DISPATCH_QUEUE_SERIAL 開啟一個(gè)子線程拼苍,按序執(zhí)行
并行隊(duì)列:DISPATCH_QUEUE_CONCURRENT 開啟多個(gè)子線程,無序執(zhí)行
*/
- (void)dispatch_group{
dispatch_queue_t queue = dispatch_queue_create("com.gcd.serialQueue", DISPATCH_QUEUE_SERIAL);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
NSLog(@"1");
[NSThread sleepForTimeInterval:5];
NSLog(@"1--");
});
dispatch_group_async(group, queue, ^{
NSLog(@"2");
[NSThread sleepForTimeInterval:8];
NSLog(@"2--");
});
dispatch_group_async(group, queue, ^{
NSLog(@"3");
[NSThread sleepForTimeInterval:3];
NSLog(@"3--");
});
dispatch_group_notify(group, queue, ^{
NSLog(@"notify:任務(wù)都完成了");
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"回到主線程");
});
});
}
dispatch_group_enter和dispatch_group_leave是成對(duì)出現(xiàn)的调缨,可以按照引用計(jì)數(shù)+1疮鲫、-1理解。
/*
串行隊(duì)列:DISPATCH_QUEUE_SERIAL 開啟一個(gè)子線程弦叶,按序執(zhí)行
并行隊(duì)列:DISPATCH_QUEUE_CONCURRENT 開啟多個(gè)子線程俊犯,無序執(zhí)行
注意:dispatch_group_notify會(huì)與耗時(shí)最長(zhǎng)的線程在同一個(gè)線程
*/
- (void)dispatch_group_enter{
dispatch_queue_t queue = dispatch_queue_create("com.GCD.group", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
dispatch_async(queue, ^{
sleep(5);
NSLog(@"任務(wù)一完成");
dispatch_group_leave(group);
});
dispatch_group_enter(group);
dispatch_async(queue, ^{
sleep(8);
NSLog(@"任務(wù)二完成");
dispatch_group_leave(group);
});
dispatch_group_enter(group);
dispatch_async(queue, ^{
sleep(3);
NSLog(@"任務(wù)三完成");
dispatch_group_leave(group);
});
dispatch_group_notify(group, queue, ^{
NSLog(@"任務(wù)完成");
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"回到主線程");
});
});
}
dispatch_barrier
/*
dispatch_barrier_sync和dispatch_barrier_async的共同點(diǎn):
1、都會(huì)等待在它前面插入隊(duì)列的任務(wù)(1湾蔓、2瘫析、3)先執(zhí)行完
2砌梆、都會(huì)等待他們自己的任務(wù)(0)執(zhí)行完再執(zhí)行后面的任務(wù)(4默责、5贬循、6)
dispatch_barrier_sync和dispatch_barrier_async的不共同點(diǎn):
在將任務(wù)插入到queue的時(shí)候,dispatch_barrier_sync需要等待自己的任務(wù)(0)結(jié)束之后才會(huì)繼續(xù)程序桃序,然后插入被寫在它后面的任務(wù)(4杖虾、5、6)媒熊,然后執(zhí)行后面的任務(wù)
而dispatch_barrier_async將自己的任務(wù)(0)插入到queue之后奇适,不會(huì)等待自己的任務(wù)結(jié)束,它會(huì)繼續(xù)把后面的任務(wù)(4芦鳍、5嚷往、6)插入到queue
*/
- (void)dispatch_barrier{
dispatch_queue_t queue = dispatch_queue_create("com.GCD.barrier", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"1");
[NSThread sleepForTimeInterval:3];
NSLog(@"1--");
});
dispatch_async(queue, ^{
NSLog(@"2");
[NSThread sleepForTimeInterval:5];
NSLog(@"2--");
});
dispatch_async(queue, ^{
NSLog(@"3");
[NSThread sleepForTimeInterval:2];
NSLog(@"3--");
});
dispatch_barrier_async(queue, ^{
NSLog(@"barrier");
[NSThread sleepForTimeInterval:2];
NSLog(@"barrier--");
[NSThread sleepForTimeInterval:3];
NSLog(@"barrier==");
});
NSLog(@"aaa");
dispatch_async(queue, ^{
NSLog(@"4");
[NSThread sleepForTimeInterval:3];
NSLog(@"4--");
});
NSLog(@"bbb");
dispatch_async(queue, ^{
NSLog(@"5");
[NSThread sleepForTimeInterval:5];
NSLog(@"5--");
});
dispatch_async(queue, ^{
NSLog(@"6");
[NSThread sleepForTimeInterval:2];
NSLog(@"6--");
});
}