原創(chuàng)總結(jié),干貨,有誤歡迎指正,轉(zhuǎn)載請注明出處,謝謝。
1. iOS多任務(wù)用啥好?
兩大利器:GCD與NSOperation
2. 為啥用這兩個東西,不直接用NSThread?
1)使我們更專注于實現(xiàn)功能,把tasks扔到Dispatch Queue,或者Operation Queue里,讓它們負(fù)責(zé)開辟回收線程,處理線程同步問題
2) 提供了解決 Race Condition, PRiority reverse 的能力。 ------- 有三個問題:共享資源訪問,優(yōu)先級反轉(zhuǎn),死鎖。
3)使用block,方便。
4) 提供控制task執(zhí)行的方法(暫停取消任務(wù),獲取任務(wù)狀態(tài),得到任務(wù)&所有任務(wù)完成的反饋); 多個task可以設(shè)定依賴關(guān)系,按順序執(zhí)行。
3. GCD分類
首先Dispatch Queue: 分為串行隊列,并行隊列。 也可分為系統(tǒng)queue,自定義queue。
1) main Queue : 串行隊列,對應(yīng)這UI主線程。
2) Global Queue: 并行。
3) 自定義,默認(rèn)串行,指定參數(shù)并行。
4.并行隊列有啥用?
好幾個task同時執(zhí)行,快。
5. 串行隊列有啥用?
1)隊列里的tasks如果需要先后順序關(guān)系, 2)解決同步訪問資源問題 Race Condition
6. GCD Group干啥的?
把任務(wù)放到隊列里的同時也可以放到Group里,目的是可以知道所有任務(wù)都結(jié)束了。使用 Group_notify
7.Dispatch queue 的 sync / async 注意事項:
1)sync 阻塞當(dāng)前線程,等待方法返回,這是和async的區(qū)別
2)不要在主線程(main queue)里調(diào)用sync ---卡住UI,感覺程序死掉了
3) 不要 currentQueue.sync , 這樣會把currentQueue阻塞了,然后還想讓它執(zhí)行任務(wù) ---- DeadLock. 當(dāng)然,swift里已經(jīng)不能currentQueue了。
4)queueA.sync { 這里邊別調(diào)用queueA} ---又是DeadLock.
5)sync各種不能用,哪用它做啥?? ------ 多個線程訪問共享資源的時候用 。。用 [private serial queue ].sync 實現(xiàn)get , 用[private serial queue ].async實現(xiàn)set。
8. 解決共享資源訪問
1)把dispatchBarrier 放到并發(fā)Queue里,先于執(zhí)行的仍然并行,dispatchBarrier串行, 之后的再并行。
2)private serial queue ----私有串行隊列--- 蘋果WWDC推薦方式,不推薦用Barrier了。
新聞熱點
疑難解答
圖片精選