Operation(多線程),operation多線程

來源:互聯網
上載者:User

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 基本應用及優先順序小案例。
實現後效果如下:

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.