iOSGCD(GrandCentralDispatch)的使用(1)-創(chuàng)新互聯(lián)

GCD優(yōu)勢(shì):

易用: GCD 提供一個(gè)易于使用的并發(fā)模型而不僅僅只是鎖和線程,以幫助我們避開(kāi)并發(fā)陷阱,而且因?yàn)榛赽lock,它能極為簡(jiǎn)單得在不同代碼作用域之間傳遞上下文。

靈活: GCD 具有在常見(jiàn)模式上(比如鎖、單例),用更高性能的方法優(yōu)化代碼,而且 GCD 能提供更多的控制權(quán)力以及大量的底層函數(shù)。
性能: GCD 能自動(dòng)根據(jù)系統(tǒng)負(fù)載來(lái)增減線程數(shù)量,這就減少了上下文切換以及增加了計(jì)算效率。

目前成都創(chuàng)新互聯(lián)已為上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站托管、服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、和林格爾網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

GCD相關(guān)概念

  • Dispatch Objects:
    GCD是純C語(yǔ)言的,但它被組建成面向?qū)ο蟮娘L(fēng)格。GCD對(duì)象被稱為dispatch object, 所有的dispatch objects都是OC對(duì)象.,就如其他OC對(duì)象一樣,當(dāng)開(kāi)啟了ARC(automatic reference counting)時(shí),dispatch objects的retain和release都會(huì)自動(dòng)執(zhí)行。而如果是MRC的話,dispatch objects會(huì)使用dispatch_retain和dispatch_release這兩個(gè)方法來(lái)控制引用計(jì)數(shù)。

  • Serial & Concurrent:
    串行任務(wù)就是每次只有一個(gè)任務(wù)被執(zhí)行,并發(fā)任務(wù)就是在同一時(shí)間可以有多個(gè)任務(wù)被執(zhí)行。

  • Synchronous & Asynchronous:
    同步函數(shù) 意思是在完成了它預(yù)定的任務(wù)后才返回,在任務(wù)執(zhí)行時(shí)會(huì)阻塞當(dāng)前線程。而 異步函數(shù) 則是任務(wù)會(huì)完成但不會(huì)等它完成,所以異步函數(shù)不會(huì)阻塞當(dāng)前線程,會(huì)繼續(xù)去執(zhí)行下一個(gè)函數(shù)。

  • Context Switch:
    Context Switch即上下文切換,一個(gè)上下文切換指當(dāng)你在單個(gè)進(jìn)程里切換執(zhí)行不同的線程時(shí)存儲(chǔ)與恢復(fù)執(zhí)行狀態(tài)的過(guò)程。這個(gè)過(guò)程在編寫(xiě)多任務(wù)應(yīng)用時(shí)很普遍,但會(huì)帶來(lái)一些額外的開(kāi)銷。

  • Dispatch Queues:
    GCD dispatch queues是一個(gè)強(qiáng)大的執(zhí)行多任務(wù)的工具。Dispatch queue是一個(gè)對(duì)象,它可以接受任務(wù),并將任務(wù)以先進(jìn)先出(FIFO)的順序來(lái)執(zhí)行。Dispatch queue可以并發(fā)的或串行的執(zhí)行任意一個(gè)代碼塊,而且并發(fā)任務(wù)會(huì)像NSOperationQueue那樣基于系統(tǒng)負(fù)載來(lái)合適地并發(fā)進(jìn)行,串行隊(duì)列同一時(shí)間則只執(zhí)行單一任務(wù)。Dispatch queues內(nèi)部使用的是線程,GCD 管理這些線程,并且使用Dispatch queues的時(shí)候,我們都不需要自己創(chuàng)建線程。Dispatch queues相對(duì)于和線程直接通信的代碼優(yōu)勢(shì)是:Dispatch queues使用起來(lái)特別方便,執(zhí)行任務(wù)更加有效率。

GCD三種隊(duì)列類型

(1) 主線程隊(duì)列: main queue可以調(diào)用dispatch_get_main_queue()來(lái)獲得。因?yàn)閙ain queue是與主線程相關(guān)的,所以這是一個(gè)串行隊(duì)列。和其它串行隊(duì)列一樣,這個(gè)隊(duì)列中的任務(wù)一次只能執(zhí)行一個(gè)。它能保證所有的任務(wù)都在主線程執(zhí)行,而主線程是唯一可用于更新 UI 的線程。

(2) 并發(fā)隊(duì)列: 并發(fā)隊(duì)列雖然是能同時(shí)執(zhí)行多個(gè)任務(wù),但這些任務(wù)仍然是按照先到先執(zhí)行(FIFO)的順序來(lái)執(zhí)行的。并發(fā)隊(duì)列會(huì)基于系統(tǒng)負(fù)載來(lái)合適地選擇并發(fā)執(zhí)行這些任務(wù)。在iOS5之前,并發(fā)隊(duì)列一般指的就是全局隊(duì)列(Global queue),進(jìn)程中存在四個(gè)全局隊(duì)列:高、中(默認(rèn))、低、后臺(tái)四個(gè)優(yōu)先級(jí)隊(duì)列,可以調(diào)用dispatch_get_global_queue函數(shù)傳入優(yōu)先級(jí)來(lái)訪問(wèn)隊(duì)列。而在iOS5之后,我們也可以用dispatch_queue_create,并指定隊(duì)列類型DISPATCH_QUEUE_CONCURRENT,來(lái)自己創(chuàng)建一個(gè)并發(fā)隊(duì)列。

(3) 串行隊(duì)列: 串行隊(duì)列將任務(wù)以先進(jìn)先出(FIFO)的順序來(lái)執(zhí)行,所以串行隊(duì)列經(jīng)常用來(lái)做訪問(wèn)某些特定資源的同步處理。你可以也根據(jù)需要?jiǎng)?chuàng)建多個(gè)隊(duì)列,而這些隊(duì)列相對(duì)其他隊(duì)列都是并發(fā)執(zhí)行的。換句話說(shuō),如果你創(chuàng)建了4個(gè)串行隊(duì)列,每一個(gè)隊(duì)列在同一時(shí)間都只執(zhí)行一個(gè)任務(wù),對(duì)這四個(gè)任務(wù)來(lái)說(shuō),他們是相互獨(dú)立且并發(fā)執(zhí)行的。如果需要?jiǎng)?chuàng)建串行隊(duì)列,一般用dispatch_queue_create這個(gè)方法來(lái)實(shí)現(xiàn)。

介紹完基本概念,我們看看如何使用…..


創(chuàng)建和管理隊(duì)列

(1) global queue(全局隊(duì)列):
當(dāng)我們需要同時(shí)執(zhí)行多個(gè)任務(wù)時(shí),并發(fā)隊(duì)列是非常有用的。并發(fā)隊(duì)列其實(shí)仍然還是一個(gè)隊(duì)列,它保留了隊(duì)列中的任務(wù)按先進(jìn)先出(FIFO)的順序執(zhí)行的特點(diǎn)。一個(gè)并發(fā)隊(duì)列中實(shí)際執(zhí)行的任務(wù)數(shù)是由很多因素決定的,比如系統(tǒng)的內(nèi)核數(shù),其他串行隊(duì)列中任務(wù)的優(yōu)先級(jí),以及其他進(jìn)程的工作狀態(tài)。但是global queue 對(duì)于 dispatch_suspend(暫停)、dispatch_resume(恢復(fù))、dispatch_set_context(切換上下文)函數(shù)無(wú)響應(yīng)

我們來(lái)看一看 dispatch queue隊(duì)列的優(yōu)先級(jí)都有哪些

#define DISPATCH_QUEUE_PRIORITY_HIGH 2 //高

#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 //默認(rèn)

#define DISPATCH_QUEUE_PRIORITY_LOW (-2) //低

#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN //后臺(tái)

注意:
盡管dispatch queues是引用計(jì)數(shù)對(duì)象,但是我們不需要用retain和release來(lái)管理全局的并發(fā)隊(duì)列。因?yàn)槿株?duì)列對(duì)于程序來(lái)說(shuō)是全局的,retain和release會(huì)被全局隊(duì)列忽略,而且在ARC下這兩個(gè)方法也會(huì)被忽略的。所以,我們不需要存儲(chǔ)這些隊(duì)列的引用數(shù),僅僅只需要在任何要使用它們的地方,調(diào)用dispatch_get_global_queue這個(gè)方法即可。

(2) 并發(fā)隊(duì)列和串行隊(duì)列
當(dāng)我們需要某些任務(wù)以指定的順序去執(zhí)行時(shí),串行隊(duì)列是一個(gè)非常好的選擇。一個(gè)串行隊(duì)列在同一時(shí)間里只會(huì)執(zhí)行一個(gè)任務(wù),而且每次都只會(huì)從隊(duì)列的頭部把任務(wù)取出來(lái)執(zhí)行。正因?yàn)槿绱?,我們可以用串行?duì)列來(lái)替代鎖的操作,比如數(shù)據(jù)資源的同步或修改數(shù)據(jù)結(jié)構(gòu)時(shí)。和鎖不同的是,串行隊(duì)列能保證任務(wù)都是在可預(yù)見(jiàn)的順序里執(zhí)行,而且一旦我們?cè)谝粋€(gè)串行隊(duì)列里異步提交了任務(wù),隊(duì)列就能永遠(yuǎn)不發(fā)生死鎖。怎么樣,是不是很棒,不過(guò)不像并發(fā)隊(duì)列,這些串行隊(duì)列是需要我們自己創(chuàng)建和管理的。

我們還可以在程序里創(chuàng)建任意數(shù)量的隊(duì)列,不過(guò)值得注意的是,我們要盡量避免創(chuàng)建大量的串行隊(duì)列而目的僅僅是為了同時(shí)執(zhí)行隊(duì)列中的這些任務(wù)。雖然GCD 通過(guò)創(chuàng)建所謂的線程池來(lái)大致匹配 CPU 內(nèi)核數(shù)量,但是線程的創(chuàng)建并不是無(wú)代價(jià)的。每個(gè)線程都需要占用內(nèi)存和內(nèi)核資源。所以如果需要?jiǎng)?chuàng)建大量的并發(fā)任務(wù),我們只需要把這些任務(wù)放到并發(fā)隊(duì)列中即可。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前文章:iOSGCD(GrandCentralDispatch)的使用(1)-創(chuàng)新互聯(lián)
分享URL:http://muchs.cn/article32/ddcppc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、服務(wù)器托管、網(wǎng)站收錄、企業(yè)建站商城網(wǎng)站、軟件開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作