iOS開發多執行緒在實際專案中的運用
在實際專案開發中為了能夠給使用者更好的體驗,有些延時操作我們都會放在子執行緒中進行。
今天我們就來聊聊多執行緒在實際專案中的運用。
我們先來看看多執行緒的基礎知識:
1.多執行緒的原理:
同一時間,CPU只能處理一條執行緒,也就是隻有一條執行緒在工作。所謂多執行緒併發(同時)執行,
其實是CPU快速的在多執行緒之間排程(切換)。如果CPU排程執行緒的時間足夠快,就造成了多執行緒並
發執行的假象。
2.在實際專案開發中並不是執行緒越多越好,如果開了大量的執行緒,會消耗大量的CPU資源,CPU會
被累死,所以一般手機只開1~3個執行緒為宜,不超過5個。
3.多執行緒的優缺點:
優點:1.能適當提高程式的執行效率
2.能適當提高資源的利用率,這個利用率表現在(CPU,記憶體的利用率)
缺點:1.開啟執行緒需要佔用一定的記憶體空間(預設情況下,主執行緒佔用1M,
子執行緒佔用512KB,如果開啟大量的執行緒,會佔用大量的記憶體空間,降低程式
的效能)
2.執行緒越多,CPU在排程執行緒上的開銷就越大
3.程式設計就越複雜:比如執行緒之間的通訊,多執行緒的資料共享,這些
都需要程式的處理,增加了程式的複雜度。
4.在iOS開發中使用執行緒的注意事項:
1.別將比較耗時的操作放在主執行緒中
2.耗時操作會卡住主執行緒,嚴重影響UI的流暢度,給使用者一種“卡”的壞體驗
好了,多執行緒在iOS中的開發概念性的東西就講這麼多,下面我們來模擬一種開發中的場景:
我們在開發中經常會遇到,當你要快取一組圖片,但是這些圖片必須要等到你緩衝好了後再來展現在UI上,
可是我們快取圖片的時候用的是SDWebImage框架,快取的操作是非同步進行的,我們如何來做到等快取好了
再來執行以後的操作呢?下面講個實現起來非常簡單,方便的方法:
我先來放上程式碼,後面進行講解:
//1.新增一個組 let group = dispatch_group_create() //快取圖片 for url in picURLs! { //2.將當前的下載操作新增到組中 dispatch_group_enter(group) SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions.init(rawValue: 0), progress: nil, completed: { (_, _, _, _, _) in //3.離開當前組 dispatch_group_leave(group) print("正在快取中...") }) } //通過閉包將資料傳遞給呼叫者(通知圖片快取完畢) dispatch_group_notify(group, dispatch_get_main_queue()) { print("快取完畢!") finished() }
列印結果如下:
從輸出結果我們就可以看出來:我們做到了快取完畢後再來執行以後的操作。
是如何做到的呢?
我在程式碼中已經用數字標出來了:
1.我們首先用
let group = dispatch_group_create()
函式來建立一個組,用來存放緩衝的操作
2.用這個函式做到把每一次的緩衝操作都新增到組中
dispatch_group_enter(group)
3.快取圖片我用的是SDWebImage框架,我們可以看到,我在緩衝完畢後離開當前組,用到如下函式dispatch_group_leave(group)
用了這三步就能做到我們想要的功能嗎?顯然不是,做了這三部系統內部就會為我們做些事了,
當我們離開當前組的時候,系統就會發出一個通知,我們來接收這個通知,當我們接收到這個通知的時候
我們就可以執行finished的操作了,接收通知的函式是:
dispatch_group_notify(group, dispatch_get_main_queue()) {
print("快取完畢!")
finished()
}
以上就是一個非常方便的實現我們需要的功能的方法