靈活: GCD 具有在常見模式上(比如鎖、單例),用更高性能的方法優(yōu)化代碼,而且 GCD 能提供更多的控制權(quán)力以及大量的底層函數(shù)。
性能: GCD 能自動根據(jù)系統(tǒng)負載來增減線程數(shù)量,這就減少了上下文切換以及增加了計算效率。
成都創(chuàng)新互聯(lián)主要從事成都網(wǎng)站制作、成都做網(wǎng)站、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)黎城,10余年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108
Dispatch Objects:
GCD是純C語言的,但它被組建成面向?qū)ο蟮娘L(fēng)格。GCD對象被稱為dispatch object, 所有的dispatch objects都是OC對象.,就如其他OC對象一樣,當(dāng)開啟了ARC(automatic reference counting)時,dispatch objects的retain和release都會自動執(zhí)行。而如果是MRC的話,dispatch objects會使用dispatch_retain和dispatch_release這兩個方法來控制引用計數(shù)。
Serial & Concurrent:
串行任務(wù)就是每次只有一個任務(wù)被執(zhí)行,并發(fā)任務(wù)就是在同一時間可以有多個任務(wù)被執(zhí)行。
Synchronous & Asynchronous:
同步函數(shù) 意思是在完成了它預(yù)定的任務(wù)后才返回,在任務(wù)執(zhí)行時會阻塞當(dāng)前線程。而 異步函數(shù) 則是任務(wù)會完成但不會等它完成,所以異步函數(shù)不會阻塞當(dāng)前線程,會繼續(xù)去執(zhí)行下一個函數(shù)。
Context Switch:
Context Switch即上下文切換,一個上下文切換指當(dāng)你在單個進程里切換執(zhí)行不同的線程時存儲與恢復(fù)執(zhí)行狀態(tài)的過程。這個過程在編寫多任務(wù)應(yīng)用時很普遍,但會帶來一些額外的開銷。
Dispatch Queues:
GCD dispatch queues是一個強大的執(zhí)行多任務(wù)的工具。Dispatch queue是一個對象,它可以接受任務(wù),并將任務(wù)以先進先出(FIFO)的順序來執(zhí)行。Dispatch queue可以并發(fā)的或串行的執(zhí)行任意一個代碼塊,而且并發(fā)任務(wù)會像NSOperationQueue那樣基于系統(tǒng)負載來合適地并發(fā)進行,串行隊列同一時間則只執(zhí)行單一任務(wù)。Dispatch queues內(nèi)部使用的是線程,GCD 管理這些線程,并且使用Dispatch queues的時候,我們都不需要自己創(chuàng)建線程。Dispatch queues相對于和線程直接通信的代碼優(yōu)勢是:Dispatch queues使用起來特別方便,執(zhí)行任務(wù)更加有效率。
(1) 主線程隊列: main queue可以調(diào)用dispatch_get_main_queue()來獲得。因為main queue是與主線程相關(guān)的,所以這是一個串行隊列。和其它串行隊列一樣,這個隊列中的任務(wù)一次只能執(zhí)行一個。它能保證所有的任務(wù)都在主線程執(zhí)行,而主線程是唯一可用于更新 UI 的線程。
(2) 并發(fā)隊列: 并發(fā)隊列雖然是能同時執(zhí)行多個任務(wù),但這些任務(wù)仍然是按照先到先執(zhí)行(FIFO)的順序來執(zhí)行的。并發(fā)隊列會基于系統(tǒng)負載來合適地選擇并發(fā)執(zhí)行這些任務(wù)。在iOS5之前,并發(fā)隊列一般指的就是全局隊列(Global queue),進程中存在四個全局隊列:高、中(默認)、低、后臺四個優(yōu)先級隊列,可以調(diào)用dispatch_get_global_queue函數(shù)傳入優(yōu)先級來訪問隊列。而在iOS5之后,我們也可以用dispatch_queue_create,并指定隊列類型DISPATCH_QUEUE_CONCURRENT,來自己創(chuàng)建一個并發(fā)隊列。
(3) 串行隊列: 串行隊列將任務(wù)以先進先出(FIFO)的順序來執(zhí)行,所以串行隊列經(jīng)常用來做訪問某些特定資源的同步處理。你可以也根據(jù)需要創(chuàng)建多個隊列,而這些隊列相對其他隊列都是并發(fā)執(zhí)行的。換句話說,如果你創(chuàng)建了4個串行隊列,每一個隊列在同一時間都只執(zhí)行一個任務(wù),對這四個任務(wù)來說,他們是相互獨立且并發(fā)執(zhí)行的。如果需要創(chuàng)建串行隊列,一般用dispatch_queue_create這個方法來實現(xiàn)。
介紹完基本概念,我們看看如何使用…..
(1) global queue(全局隊列):
當(dāng)我們需要同時執(zhí)行多個任務(wù)時,并發(fā)隊列是非常有用的。并發(fā)隊列其實仍然還是一個隊列,它保留了隊列中的任務(wù)按先進先出(FIFO)的順序執(zhí)行的特點。一個并發(fā)隊列中實際執(zhí)行的任務(wù)數(shù)是由很多因素決定的,比如系統(tǒng)的內(nèi)核數(shù),其他串行隊列中任務(wù)的優(yōu)先級,以及其他進程的工作狀態(tài)。但是global queue 對于 dispatch_suspend(暫停)、dispatch_resume(恢復(fù))、dispatch_set_context(切換上下文)函數(shù)無響應(yīng)
我們來看一看 dispatch queue隊列的優(yōu)先級都有哪些
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 //高
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 //默認
#define DISPATCH_QUEUE_PRIORITY_LOW (-2) //低
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN //后臺
注意:
盡管dispatch queues是引用計數(shù)對象,但是我們不需要用retain和release來管理全局的并發(fā)隊列。因為全局隊列對于程序來說是全局的,retain和release會被全局隊列忽略,而且在ARC下這兩個方法也會被忽略的。所以,我們不需要存儲這些隊列的引用數(shù),僅僅只需要在任何要使用它們的地方,調(diào)用dispatch_get_global_queue這個方法即可。
(2) 并發(fā)隊列和串行隊列
當(dāng)我們需要某些任務(wù)以指定的順序去執(zhí)行時,串行隊列是一個非常好的選擇。一個串行隊列在同一時間里只會執(zhí)行一個任務(wù),而且每次都只會從隊列的頭部把任務(wù)取出來執(zhí)行。正因為如此,我們可以用串行隊列來替代鎖的操作,比如數(shù)據(jù)資源的同步或修改數(shù)據(jù)結(jié)構(gòu)時。和鎖不同的是,串行隊列能保證任務(wù)都是在可預(yù)見的順序里執(zhí)行,而且一旦我們在一個串行隊列里異步提交了任務(wù),隊列就能永遠不發(fā)生死鎖。怎么樣,是不是很棒,不過不像并發(fā)隊列,這些串行隊列是需要我們自己創(chuàng)建和管理的。
我們還可以在程序里創(chuàng)建任意數(shù)量的隊列,不過值得注意的是,我們要盡量避免創(chuàng)建大量的串行隊列而目的僅僅是為了同時執(zhí)行隊列中的這些任務(wù)。雖然GCD 通過創(chuàng)建所謂的線程池來大致匹配 CPU 內(nèi)核數(shù)量,但是線程的創(chuàng)建并不是無代價的。每個線程都需要占用內(nèi)存和內(nèi)核資源。所以如果需要創(chuàng)建大量的并發(fā)任務(wù),我們只需要把這些任務(wù)放到并發(fā)隊列中即可。
網(wǎng)站欄目:iOSGCD(GrandCentralDispatch)的使用(1)
當(dāng)前網(wǎng)址:http://jinyejixie.com/article10/ppehdo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、標(biāo)簽優(yōu)化、企業(yè)建站、電子商務(wù)、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)