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