1.耗時操作
通常我們需要做耗時操作的時,可以直接使用下面代碼,GCD會自動幫我們創建線程進行處理
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//耗時操作
NSLog(@"1");
dispatch_async(dispatch_get_main_queue(), ^{
//更新UI
NSLog(@"2");
});
});
2.阻塞式(有先后順序)操作
若遇到任務有先后順序,可以考慮barrier,阻塞式
eg: 流程任務,需要多個網絡請求的值進行匯總,再進行網絡請求,再匯總。
下面的任務順序就是 123順序任意改變 接著永遠是4444444 再 567順序任意改變 最后永遠是8888888
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"1");
});
dispatch_async(queue, ^{
NSLog(@"2");
});
dispatch_async(queue, ^{
NSLog(@"3");
});
dispatch_barrier_async(queue, ^{
NSLog(@"444444");
dispatch_async(queue, ^{
NSLog(@"5");
});
dispatch_async(queue, ^{
NSLog(@"6");
});
dispatch_async(queue, ^{
NSLog(@"7");
});
dispatch_barrier_async(queue, ^{
NSLog(@"888888");
});
});
這樣寫也是可以的
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"1");
});
dispatch_async(queue, ^{
NSLog(@"2");
});
dispatch_async(queue, ^{
NSLog(@"3");
});
dispatch_barrier_async(queue, ^{
NSLog(@"444444");
});
dispatch_async(queue, ^{
NSLog(@"5");
});
dispatch_async(queue, ^{
NSLog(@"6");
});
dispatch_async(queue, ^{
NSLog(@"7");
});
dispatch_barrier_async(queue, ^{
NSLog(@"888888");
});
3.1調度組:一組代碼完成后統一做處理
dispatch_group_notify是異步的來監聽group調度組中的人物完成情況,若所有人物完成則會調用notify中的任務,但是notify后面的任務還是會先執行,但后面的任務在代碼中是主線程不是子線程
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t global = dispatch_get_global_queue(0, 0);
dispatch_group_async(group, global, ^{
[NSThread sleepForTimeInterval:1.0];
NSLog(@"任務一:%@",[NSThread currentThread]);
});
dispatch_group_async(group, global, ^{
NSLog(@"任務二:%@",[NSThread currentThread]);
});
dispatch_group_async(group, global, ^{
NSLog(@"任務三:%@",[NSThread currentThread]);
});
dispatch_group_notify(group, global, ^{
NSLog(@"一二三都完成");
});
NSLog(@"異步代碼");
3.2調度組
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
是同步的等待,當調度組中的任務全部執行完畢的時候才會調用wait后面的語句,
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t global = dispatch_get_global_queue(0, 0);
dispatch_group_async(group, global, ^{
[NSThread sleepForTimeInterval:1.0];
NSLog(@"任務一:%@",[NSThread currentThread]);
});
dispatch_group_async(group, global, ^{
NSLog(@"任務二:%@",[NSThread currentThread]);
});
dispatch_group_async(group, global, ^{
NSLog(@"任務三:%@",[NSThread currentThread]);
});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"異步代碼");
調度組總結:
wait可以理解為sync
notify可以理解為async
調度組還有對應的 enter leave方法 不過并不是很實用