队列 和 线程 之GCD dispatch
1.dispatch_queue_create? 創建隊列開啟異步線程(1,4,2,3)
// 創建一個隊列dispatch_queue_t queue = dispatch_queue_create("my.test.queue", DISPATCH_QUEUE_CONCURRENT);NSLog(@"1111");// 開啟一個異步線程dispatch_async(queue, ^{NSLog(@"2222");// 線程等待10秒[NSThread sleepForTimeInterval:5];NSLog(@"3333");});NSLog(@"4444");2.創建隊列開啟同步線程(1,2,3,4)
// 創建一個隊列dispatch_queue_t queue = dispatch_queue_create("my.test.queue", DISPATCH_QUEUE_CONCURRENT);NSLog(@"1111");// 開啟一個同步線程dispatch_sync(queue, ^{NSLog(@"2222");// 線程等待10秒[NSThread sleepForTimeInterval:5];NSLog(@"3333");});NSLog(@"4444");3.dispatch_get_global_queue 獲取全局隊列開啟異步線程(1,4,2,3)
NSLog(@"1111");// 獲取全局隊列dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);// 開啟一個異步線程dispatch_async(queue, ^{NSLog(@"2222222");[NSThread sleepForTimeInterval:5];NSLog(@"333");});NSLog(@"4444");4.獲取全局隊列開啟同步線程 (1,2,3,4)
NSLog(@"1111");// 獲取全局隊列dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);// 開啟一個同步線程dispatch_sync(queue, ^{NSLog(@"2222222");[NSThread sleepForTimeInterval:5];NSLog(@"333");});NSLog(@"4444");5.dispatch_get_main_queue() ?獲取主線程隊列,再開啟異步線程(1,4,2,3)
NSLog(@"1111");// 獲取主線程隊列dispatch_queue_t queue = dispatch_get_main_queue();dispatch_async(queue, ^{NSLog(@"2222");[NSThread sleepForTimeInterval:5];NSLog(@"33333");});NSLog(@"4444");6.獲取主線程隊列,再開啟同步線程 (1) 。 線程會因為死鎖,而永遠卡死
NSLog(@"1111");// 獲取主線程隊列dispatch_queue_t queue = dispatch_get_main_queue();dispatch_sync(queue, ^{NSLog(@"2222");[NSThread sleepForTimeInterval:5];NSLog(@"33333");});NSLog(@"4444");?
總結:獲取全局隊列的名字是默認的,創建隊列時可以自己命名隊列的名字,其他用法都是一樣的。個人認為同步線程意義不大
7.dispatch_get_main_queue()? 回到主線程
??? 耗時操作需需要放在異步線程里,UI界面更新必須放在主界面里
??? [2376:131819] 1111
??? [2376:131819] 4444
??? [2376:131860] 2222
??? [2376:131860] 3333
??? [2376:131819] 5555
??? 從打印結果來看(1,4,5是在主線程里面,2,3是在異步線程里面)
8.dispatch_apply? 執行某個片段N(6)次
?
dispatch_apply(6, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t index) {NSLog(@"1111");});9.dispatch_barrier_async 是在前面的任務執行結束后它才執行,而且它后面的任務等它執行完成之后才會執行 (2,1,3,4)
dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT);dispatch_async(queue, ^{[NSThread sleepForTimeInterval:3];NSLog(@"111");});dispatch_async(queue, ^{[NSThread sleepForTimeInterval:2];NSLog(@"222");});dispatch_barrier_async(queue, ^{NSLog(@"333_barrier");[NSThread sleepForTimeInterval:4];});dispatch_async(queue, ^{[NSThread sleepForTimeInterval:1];NSLog(@"444");});10.dispatch_group_async 可以實現監聽幾組任務是否完成,完成后使用 dispatch_group_notify 執行其他的操作 (1,2,3,4)
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);// 創建一組任務dispatch_group_t group = dispatch_group_create();dispatch_group_async(group, queue, ^{[NSThread sleepForTimeInterval:1];NSLog(@"111");});dispatch_group_async(group, queue, ^{[NSThread sleepForTimeInterval:2];NSLog(@"222");});dispatch_group_async(group, queue, ^{[NSThread sleepForTimeInterval:3];NSLog(@"333");});// 監聽所有組的任務完成之后執行,一般是回到主線程刷新UI界面dispatch_group_notify(group, dispatch_get_main_queue(), ^{NSLog(@"444");});11.dispatch_once 對于某個任務執行一次,且只執行一次。 dispatch_once函數有兩個參數,第一個參數predicate用來保證執行一次,第二個參數是要執行一次的任務block。
static dispatch_once_t predicate; dispatch_once(&predicate, ^{// some one-time task });?
暫時用到這么多,以后再用到會繼續補充,也歡迎大家指出遺漏!
轉載于:https://www.cnblogs.com/shen5214444887/p/4917343.html
總結
以上是生活随笔為你收集整理的队列 和 线程 之GCD dispatch的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内存和swap查看 内存是拿来用的 不
- 下一篇: PLS-00172: string li