Operation(多線程)

来源:http://www.cnblogs.com/EchoHG/archive/2017/10/16/7675846.html
-Advertisement-
Play Games

1. 進程和線程 1.1 進程 進程:正在運行的應用程式叫進程 進程之間都是獨立的,運行在專用且受保護的記憶體空間中 兩個進程之間無法通訊 通俗的理解,手機上同時開啟了兩個App。這兩個App肯定是在不同的進程中的。所以這兩個App之間是獨立的,記憶體中的數據不能互相竄來竄去,兩個App之間也沒有辦法進 ...


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一旦運行,預設就會開啟一條線程。這條線程,我們通常稱作為“主線程

主線程的作用:

  1. 刷新UI
  2. 處理UI事件,例如點擊、滾動、拖拽。

如果主線程的操作太多、太耗時,就會造成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 //        第三步:創建OperationQueue
11         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 里有四種方法來處理錯誤:

  1. 把錯誤從函數傳遞到調用函數的代碼里
  2. 使用一個 do-catch 語句來處理錯誤
  3. 把錯誤當做一個可選值來處理
  4. 斷言這個錯誤不會發生

 

因為Demo裡面用到了do catch,那咱們就只說do catch.
在Swift的標準try中,是要配合do catch的。

下麵是do-catch語句的一般格式,如果do分句內的代碼拋出了一個錯誤,它就被catch分句捕獲,並判斷由哪個分句來處理此錯誤。

1 do {
2     try expression
3     statements
4 } catch pattern 1 {
5     statements
6 } catch pattern 2 where condition {
7     statements
8 }

3.3 優先順序

在思維導圖裡面出現了兩個優先順序。一個是屬於Operation 的,一個是屬於OperationQueue的。那咱們分看看看這兩個都是啥。

3.3.1 Operation中的優先順序

Operation裡面的這個叫做qualityOfService

1 public enum QualityOfService : Int {
2     case userInteractive
3     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 veryLow
3     case low
4     case normal
5     case high
6     case veryHigh
7 }

這些優先順序都是相對的,並不是是說必須要執行完最高的才執行次重要的。這裡面並沒有一個特別嚴格順序。只是在分配資源上有傾向性。如果隊列需要有嚴格的執行順序,還是要添加依賴關係的,這個是我們下一篇文章要分享的內容。

4. 案例實現

Operation 基本應用及優先順序小案例。
實現後效果如下:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 介紹了藉助藍牙SPP服務實現手機和嵌入式設備通信的基本原理和實現流程。 ...
  • 1. [iOS 11] iOS 11十大實用新功能簡介 2. [iOS 11] iPhone二維碼掃描,通過內建相機就可以完成! 3. iOS 11內建屏幕錄製功能!再也不需要通過第三方應用錄屏 4. [iOS 11] iOS 11如何關閉Wi-Fi、藍牙?控制中心不能關? 5. 舊iPhone變慢 ...
  • 在項目中,經常遇到事件衝突,ScrollView,ViewPager滑動卡頓等情況,比如:onClick和onLongClick事件衝突,dispatchTouchEvent,onInterceptTouchEvent這些方法都有一個boolean返回值,不同返回值事件處理機制是不同的。 一:事件分 ...
  • copy自http://blog.csdn.net/xpsharp/article/details/7289910 1. 安裝Android應用程式 1) 啟動Android模擬器 2) adb install (apk在PC上的路徑/)*.apk (將apk文件上傳到了模擬器自帶操作系統的data ...
  • Gradle DSL method not found: 'compile() 遇見這個問題截圖: 解決: 在項目的根目錄的build.gradle文件中是不是用了compile方法 如果有的話,剪切,粘貼到app下build.gradle文件的dependencies中 重新構建一下項目解決 備忘 ...
  • 對與最近主要做的是電視機盒子端的開發,其中涉及到設備的狀態監聽比較繁瑣,所以對HDMI的連接狀態的監聽方法做個記錄,方便後續查看。 主要通過兩種方式: (1)比較常用的廣播監聽 註冊一個動態廣播來獲取HDMI介面的插拔,它的Action的name為 “android.intent.action.HD ...
  • 之前在做筆試題的時候遇到一個問題:Activity A切換到ActivityB時,A和B的生命周期變化。 事實上,它們的生命周期變化是這樣的: 1、A的onPause()方法被執行。 2、B的onCreate()方法,onStart(),onResume()方法被順序執行。 3、如果B是不透明的,A ...
  • 10月9日,中國首屆原型設計大賽在成都開幕。此次大賽由國內優秀原型設計工具Mockplus主辦,國內多家知名協會、企業、高校協辦。本次大賽專註原型設計,旨在推動中國產品設計行業的發展,挖掘和培育設計人才,在國內尚屬首次。 近年來,隨著各類軟體、App的井噴,用戶體驗設計的要求不斷提高,產品設計行業發 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...