GCD 深入理解(一)
GCD 深入理解(一)
這篇文章是上一篇iOS 多執行緒和GCD(Grand Central Dispath) 教程 (一)的續篇
因為第一篇只是一個簡單的入門,來告訴大傢什麼是多執行緒和GCD,並沒有詳細解釋GCD的眾多用法。
因此才有這麼一篇,後面還會有一篇。
上一篇文章呢是我自己翻譯那個老外的,今天這個是網上其他人翻譯好的,我就直接借用啦~
原文地址:GCD 深入理解 (一)
————————————————————————————————————————————————————————————————————————
OK,開始!
本文由@nixzhu翻譯至raywenderlich的《grand-central-dispatch-in-depth-part-1》
雖然 GCD 已經出現過一段時間了,但不是每個人都明瞭其主要內容。這是可以理解的;併發一直很棘手,而 GCD 是基於 C 的 API ,它們就像一組尖銳的稜角戳進 Objective-C 的平滑世界。我們將分兩個部分的教程來深入學習 GCD 。 在這兩部分的系列中,第一個部分的將解釋 GCD 是做什麼的,並從許多基本的 GCD 函式中找出幾個來展示。在第二部分,你將學到幾個 GCD 提供的高階函式。 什麼是 GCD- - (void)viewDidLoad
- {
- [super viewDidLoad];
- NSAssert(_image, @"Image not set; required to use view controller");
- self.photoImageView.image = _image;
- //Resize if neccessary to ensure it's not pixelated
- if (_image.size.height <= self.photoImageView.bounds.size.height &&
- _image.size.width <= self.photoImageView.bounds.size.width) {
- [self.photoImageView setContentMode:UIViewContentModeCenter];
- }
- dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ // 1
- UIImage *overlayImage = [self faceOverlayImageFromImage:_image];
- dispatch_async(dispatch_get_main_queue(), ^{ // 2
- [self fadeInNewImage:overlayImage]; // 3
- });
- });
- }
下面來說明上面的新程式碼所做的事: 1. 你首先將工作從主執行緒移到全域性執行緒。因為這是一個 dispatch_async() ,Block 會被非同步地提交,意味著呼叫執行緒地執行將會繼續。這就使得 viewDidLoad 更早地在主執行緒完成,讓載入過程感覺起來更加快速。同時,一個人臉檢測過程會啟動並將在稍後完成。 2. 在這裡,人臉檢測過程完成,並生成了一個新的影象。既然你要使用此新影象更新你的 UIImageView ,那麼你就新增一個新的 Block 到主執行緒。記住——你必須總是在主執行緒訪問 UIKit 的類。 3. 最後,你用 fadeInNewImage: 更新 UI ,它執行一個淡入過程切換到新的曲棍球眼睛影象。 編譯並執行你的應用;選擇一個影象然後你會注意到檢視控制器載入明顯變快,曲棍球眼睛稍微在之後就加上了。這給應用帶來了不錯的效果,和之前的顯示差別巨大。 進一步,如果你試著載入一個超大的影象,應用不會在載入檢視控制器上“掛住”,這就使得應用具有很好伸縮性。 正如之前提到的, dispatch_async 新增一個 Block 都佇列就立即返回了。任務會在之後由 GCD 決定執行。當你需要在後臺執行一個基於網路或 CPU 緊張的任務時就使用 dispatch_async ,這樣就不會阻塞當前執行緒。 下面是一個關於在 dispatch_async 上如何以及何時使用不同的佇列型別的快速指導: 1. 自定義序列佇列:當你想序列執行後臺任務並追蹤它時就是一個好選擇。這消除了資源爭用,因為你知道一次只有一個任務在執行。注意若你需要來自某個方法的資料,你必須內聯另一個 Block 來找回它或考慮使用 dispatch_sync。 2. 主佇列(序列):這是在一個併發佇列上完成任務後更新 UI 的共同選擇。要這樣做,你將在一個 Block 內部編寫另一個 Block 。以及,如果你在主佇列呼叫 dispatch_async 到主佇列,你能確保這個新任務將在當前方法完成後的某個時間執行。 3. 併發佇列:這是在後臺執行非 UI 工作的共同選擇。
相關推薦
GCD 深入理解(一)
GCD 深入理解(一) 這篇文章是上一篇iOS 多執行緒和GCD(Grand Central Dispath) 教程 (一)的續篇 因為第一篇只是一個簡單的入門,來告訴大傢什麼是多執行緒和GCD,並沒有詳細解釋GCD的眾多用法。 因此才有這麼一篇,後面還會有一篇。
GCD 深入理解(二)
GCD 深入理解(二) 本文是基於上一篇文章: GCD 深入理解(一) 的後續 如果你還沒看過上一篇,那趕緊去看看吧。 本文講解了GCD的幾個更優秀的功能,快來看看吧。 原文地址:GCD 深入理解(二) ______
spring之AOP原始碼深入理解(一)aop攔截
(一) 原始碼角度 攔截機 (Interceptor), 是 AOP (Aspect-Oriented Programming) 的另一種叫法。AOP本身是一門語言,只不過我們使用的是基於JAVA的整合到Spring 中的 SpringAOP。同樣,我們將通過我們的例子來理
mysql 深入理解 (一) -- mysql簡介
什麼是資料庫? 資料庫就是儲存資料的倉庫,其本質是一個檔案系統,資料按照特定的格式將資料儲存起來,使用者可以通過SQL對資料庫中的資料進行增加,修改,刪除及查詢操作。 什麼是mysql? MySQL 是最流行的關係型資料庫管理系統,在WEB應用方面 MySQL 是最好的RDBMS(Relational Dat
Seafile深入理解(一).如何理解異地分散式部署
把複雜的問題簡單化,是大師的水平,是對技術的真正理解,所謂簡單是能切中要害,深入淺出地表達,所以提煉產品的技術亮點,是與客戶交流的基礎功課。但並非高深的技術一定是複雜的,任何產品都有它“獨特”的技術,關鍵是你條理地表達。我們常常遇到這樣的情況,我們銷售的產品使用起來非常“傻瓜
[多執行緒]GCD深入理解(二)
歡迎來到GCD深入理解系列教程的第二部分(也是最後一部分)。 在本系列的第一部分中,你已經學到超過你想像的關於併發、執行緒以及GCD 如何工作的知識。通過在初始化時利用 dispatch_once,你建立了一個執行緒安全的 PhotoManage
spring深入學習(一)深入理解 Spring IOC
1、IOC理論 IOC英文縮寫:Inversion of control, 另一個縮寫為DI:依賴注入(Denpency Injection) 用作控制反轉 理解:spring IOC就是負責物件生命週期和物件之間的關係 以找女朋友為例子: 一般情況下我們是如何來找女
JavaScript深入理解(三)
有一點 相同 定義 怎麽辦 turn 如何 nbsp 屬性。 fff 強大的原型和原型鏈 前言 JavaScript 不包含傳統的類繼承模型,而是使用 prototypal 原型模型。 雖然這經常被當作是 JavaScript 的缺點被提及,其實基於原型的繼承模型比傳
JavaScript基礎知識從淺入深理解(一)
isn argument javascrip turn console bom || 將不 函數聲明 JavaScript的簡介 javascript是一門動態弱類型的解釋型編程語言,增強頁面動態效果,實現頁面與用戶之間的實時動態的交互。 javascript是
JSP學習與理解(一)
parse runtime this java服務 b站 sps odin 作用域 地址欄 一.JSP的運用 1).WHYJSP是簡Servlet編寫的一種技術,它將Java代碼和HTML語句混合在同一個文件中編寫,只對網頁中的要動態產生的內容采用java代碼來編寫,
深入Redis(一)分布式鎖
參數 包裝 情況 變量 clas return 一個 set 標簽 分布式鎖 由於分布式應用在邏輯處理時存在並發問題,比方修改數據,要先讀取到內存,在內存中修改後再保存回去,這兩個操作是單獨的,如果同時進行,就會出現並發問題。 此時就要用到分布式鎖來限制程序的並發執行。 本
卷積神經網路理解(一):濾波器的意義
歡迎大家關注我們的網站和系列教程:http://www.tensorflownews.com/,學習更多的機器學習、深度學習的知識! 荔枝boy 卷積神經網路的發展 卷積神經網路的重要性 卷積神經網路與影象識別 濾波器 一.卷積神經網路的發展
兄弟連區塊鏈教程以太坊原始碼分析CMD深入分析(一)
cmd包分析 cmd下面總共有13個子包,除了util包之外,每個子包都有一個主函式,每個主函式的init方法中都定義了該主函式支援的命令,如 geth包下面的: func init() { // Initialize the CLI app and st
Docker核心技術理解(一)
Docker的出現是近十年軟體工程領域最大的革命,Docker的技術完全可以重鑄整個軟體開發測試運維等軟體部署的各個方面。 以前的虛擬化技術如VMware,OpenStack一般都是重量級的虛擬化,以VMware為例,首先的需要VMware這套軟體,在這基礎之上安裝具體的作業系統(比如ubantu映
ioc初步理解(一) 簡單實用aotufac搭建mvc三層+ioc(codeFirst)
1】首先搭好框架 1.1】搭建ui層 1.2】建立其他內庫檔案 整個專案基本部分搭建完畢之後如下 2】使用nuget引用檔案 先在每一個專案中引入ef 然後再UI層引入以下兩個檔案autofac和Autofac.Mvc5 3】因為本d
Spring Boot Actuator詳解與深入應用(一):Actuator 1.x
《Spring Boot Actuator詳解與深入應用》預計包括三篇,第一篇重點講Spring Boot Actuator 1.x的應用與定製端點;第二篇將會對比Spring Boot Actuator 2.x 與1.x的區別,以及應用和定製2.x的端點;第三篇將會介紹Actuator metric指
紮實基礎深入篇(一):變數與python之禪
前言:本文筆記來自於《python程式設計從入門到實踐》,Eric Mathhes著。 程式碼改變世界。 在終端中輸入python即可進入python環境,如同IDLE。當前學習的版本是python3. 請花點時間描繪三個你想建立的程式:1.一款2D小遊戲
增強學習理解(一):概念介紹
一、增強學習概念 增強學習特點: 增強學習是機器學習的一種,機器學習主要分為監督學習、非監督學習、半監督學習,增強學習就是讓計算機學著自己去做事情,進行自學習,人只需要給計算機設定一個“小目標”,具體的策略就需要計算機自己去設計啦! 跟增強學習相關的例子 動態規劃法
神經網路簡單理解(一):梯度彌散
這裡C(w)為最後的代價函式,它權值w的函式。每一層的加權輸入為ZJ=W×aj-1+b。每一層的輸出為aj,aj=φ(ZJ),這裡φ是啟用函式。 反向傳播更新的是每一層神經元連線的權重w,即求C(w)對每一層w 的偏導數。反向傳播首先求C對W4的偏導數,所以公式為: 同理,由於W
detectron程式碼理解(一):Resnet模型構建理解
這裡具體以resnet50為例進行說明,一句一句地分析程式碼,程式碼位置位於Resnet.py,具體的分析函式為add_ResNet_convX_body. 在分析之前首先貼上resnet50的程式碼結構圖: # add the stem (by default, conv1 and