Operation(多線程),operation多線程
1. 進程和線程1.1 進程
- 進程:正在啟動並執行應用程式叫進程
- 進程之間都是獨立的,運行在專用且受保護的記憶體空間中
- 兩個進程之間無法通訊
通俗的理解,手機上同時開啟了兩個App。這兩個App肯定是在不同的進程中的。所以這兩個App之間是獨立的,記憶體中的資料不能互相竄來竄去,兩個App之間也沒有辦法進行通訊。
兩個App之間沒有辦法進行通訊?我說的是正常情況下。當然還是有不正常情況啊,例如使用iOS提供的極少數的幾種進程間通訊的工具。
1.2 線程
- 線程:進程想要執行任務,必須要有線程,每個進程至少有一條線程。
- 線程就是用來幹活的。
- 程式一啟動,就會啟動進程。進程預設開啟一條線程。
幹活的線程?對啊,活太多,或者不想彼此互相等著浪費時間,當然可以找幾個人同時幹了。
例如在項目上,產品經理需求都沒有完全寫完,也不妨礙先設計一個大概的資料架構啊。例如需求沒有完全定下來,不妨礙UI童鞋提前設計啊,大不了再改嘛~ HOHO~怎麼聽上去都像是黑話。
1.3 多線程
單核CPU同一時間,CPU只能處理1個線程,只有1個線程在執行任務。
多線程的同時執行 : 其實是CPU在多條線程之間快速切換(調度任務)。
如果CPU調度線程的速度足夠快,就造成了多線程同時執行的假象
如果線程非常多,CPU會在多條線程之間不斷的調度任務,結果就是消耗了大量的CPU資源,效率下降:
iPhone手機是幾核的?
A7 : iPhone 5S , 雙核
A8: iPhone 6、iPhone 6 Plus,雙核
A9:iPhone 6S、iPhone 6S Plus,雙核
A10:iPhone 7、iPhone 7 Plus,2+2核
1.4 iOS中的多線程
剛才說了,iOS App一旦運行,預設就會開啟一條線程。這條線程,我們通常稱作為“主線程”
主線程的作用:
如果主線程的操作太多、太耗時,就會造成App卡頓現象嚴重。所以,通常我們都會把耗時的操作放在子線程中進行,擷取到結果之後,回到主線程去重新整理UI。
2. Operation
我們來看看基礎使用:
1 // 最基本的使用Operation 2 private func basicOperation() { 3 // 第一步:建立Operation 4 let op = Operation.init() 5 // 第二步:把要執行的代碼放入operation中 6 op.completionBlock = { 7 8 print(#function,#line,Thread.current) 9 }10 // 第三步:建立OperationQueue11 let opQueue = OperationQueue.init()12 // 第四步:把Operation加入到線程中13 opQueue.addOperation(op)14 }
使用BlockOperation建立operatoin,並直接運行。咱們看看會在哪條線程執行。
1 //建立一個簡單的BlockOperation 2 private func CreatBasicBlockOperation() { 3 //使用BlockOperation建立operation 4 let operation = BlockOperation.init { 5 //列印,看看在哪個線程中 6 7 print(#function,#line,Thread.current) 8 } 9 10 //直接運行operation,看看運行在哪個線程中11 operation.start()12 }
列印一下看看啟動並執行結果:
這就是我們說,建立完Operation如果直接運行,就會在當前線程執行。也就是說,如果實在主線程建立並且start的,那就會在主線程執行;如果是在子線程建立並且start的,那就會在子線程執行。
3. Basic Demo
在這個例子裡面,需求如下:
1,在子線程載入每個圖片的資料
2,圖片資料下載完畢之後,顯示出來
3,開始請求資料的時候,讓指示符開始轉動
4,所有圖片下載完畢後,指示符停止轉動
3. Basic Demo
在這個例子裡面,需求如下:
1,在子線程載入每個圖片的資料
2,圖片資料下載完畢之後,顯示出來
3,開始請求資料的時候,讓指示符開始轉動
4,所有圖片下載完畢後,指示符停止轉動
3.2 Swift中的do catch
這個是Swift和OC不一樣的地方。Swift中出現了可選值這麼一個東西,這個不是這次的重點。想深入瞭解的童鞋可以參看這篇:?和 !的使用
Swift 裡有四種方法來處理錯誤:
因為Demo裡面用到了do catch,那咱們就只說do catch.
在Swift的標準try中,是要配合do catch的。
下面是do-catch語句的一般格式,如果do分句內的代碼拋出了一個錯誤,它就被catch分句捕獲,並判斷由哪個分句來處理此錯誤。
1 do {2 try expression3 statements4 } catch pattern 1 {5 statements6 } catch pattern 2 where condition {7 statements8 }
3.3 優先順序
在思維導圖裡面出現了兩個優先順序。一個是屬於Operation 的,一個是屬於OperationQueue的。那咱們分看看看這兩個都是啥。
3.3.1 Operation中的優先順序
Operation裡面的這個叫做qualityOfService
1 public enum QualityOfService : Int {2 case userInteractive3 case userInitiated 4 case utility 5 case background 6 case `default`7 }
1 userInteractive:最高優先順序,用於使用者互動事件2 userInitiated :次高優先順序,用於使用者需要馬上執行的事件3 utility:普通優先順序,用於普通任務4 background:最低優先順序,用於不重要的任務5 default:預設優先順序,主線程和沒有設定優先權的線程都預設為這個優先順序
3.3.2 operationQueue 裡面的優先順序
operationQueue中表示優先順序的屬性是queuePriority
,表示操作在隊列中的優先順序。
1 public enum QueuePriority : Int {2 case veryLow3 case low4 case normal5 case high6 case veryHigh7 }
這些優先順序都是相對的,並不是是說必須要執行完最高的才執行次重要的。這裡面並沒有一個特別嚴格順序。只是在分配資源上有傾向性。如果隊列需要有嚴格的執行順序,還是要添加依賴關係的,這個是我們下一篇文章要分享的內容。
4. 案例實現
Operation 基本應用及優先順序小案例。
實現後效果如下: