• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      Swift多線程編程

      2017-04-25 17:58:44孔翔鳴
      電腦知識(shí)與技術(shù) 2017年2期
      關(guān)鍵詞:多線程

      孔翔鳴

      摘要:Swift日漸成為iOS的主流開發(fā)語(yǔ)言,并有取代Objective-C之勢(shì),本文通過(guò)實(shí)例介紹了Swift開發(fā)中使用GCD方案進(jìn)行多線程開發(fā)的方法,從而將App開發(fā)中多線程、異步運(yùn)行、定時(shí)器等實(shí)際需求的復(fù)雜性充分簡(jiǎn)化。

      關(guān)鍵詞:iOS;Swift;多線程

      中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2017)02-0024-02

      iOS開發(fā)方興未艾,越來(lái)越多的開發(fā)者關(guān)注并加入iOS開發(fā)的行列。傳統(tǒng)上進(jìn)行iOS開發(fā)的唯一編程語(yǔ)言是Objective-C,作為上世紀(jì)八十年代出現(xiàn)的語(yǔ)言,Objective-C在語(yǔ)法和機(jī)制上與大眾熟知的C/C++、Java等現(xiàn)代編程語(yǔ)言大相徑庭,尤其它“怪異”的語(yǔ)法使得學(xué)習(xí)難度較大,許多初學(xué)者甚至是有經(jīng)驗(yàn)的開發(fā)者也經(jīng)常對(duì)此抱怨吐槽。為了解決這種不協(xié)調(diào)性,Apple公司在經(jīng)過(guò)深思熟慮之后,在2014年WWDC上發(fā)布了新一代開發(fā)語(yǔ)言Swift,這種全新設(shè)計(jì)的語(yǔ)言一經(jīng)問(wèn)世便廣受開發(fā)者歡迎,短短2年的時(shí)間,Swift在TIOBE編程語(yǔ)言排行榜上就上升到第12位,市場(chǎng)份額直追Objective-C。眾多分析均認(rèn)為,根據(jù)Apple的戰(zhàn)略思路,Swift取代Objective-C成為Apple平臺(tái)的主打語(yǔ)言只是時(shí)間的問(wèn)題。

      眾所周知,受限于設(shè)備的軟硬件環(huán)境,App的開發(fā)難度要遠(yuǎn)遠(yuǎn)大于PC平臺(tái),為了在移動(dòng)設(shè)備上完成一些豐富的功能,需要使用很多復(fù)雜的技術(shù),多線程編程便是其中最為典型、最為普遍的一種,本文試圖從Swift的角度,探討其進(jìn)行多線程開發(fā)的一些思路與方法。

      無(wú)論是Android還是iOS的開發(fā),都涉及一個(gè)幾乎每個(gè)App都無(wú)法逃避的問(wèn)題:UI和業(yè)務(wù)邏輯的并行運(yùn)行。幾乎所有的移動(dòng)操作系統(tǒng)都不約而同地采用相同的架構(gòu):界面的更新必須在UI線程中進(jìn)行,在UI以外的線程中更新界面都會(huì)造成軟件的崩潰。這使得在移動(dòng)平臺(tái)上進(jìn)行多線程開發(fā)變得更為復(fù)雜。

      在iOS平臺(tái)上,多線程開發(fā)基本上有三種思路:NSThread、NSOperation、GCD,三種方法各有優(yōu)缺點(diǎn),Apple官方推薦的是GCD方法。GCD 是用C語(yǔ)言開發(fā)并完整封裝的多線程方案,通過(guò)使用 GCD,開發(fā)者可以利用簡(jiǎn)單的語(yǔ)法進(jìn)行靈活的多線程編程。在多線程編程素有“復(fù)雜必死” 的名聲,所以保持簡(jiǎn)單就是避免錯(cuò)誤的金科玉律。在 Swift 中可以無(wú)縫使用 GCD 的 API 的,尤其得益于閉包特性的加入,使用起來(lái)比之前在 Objective-C 中更加簡(jiǎn)單方便。

      關(guān)于GCD的介紹與教程有很多,初學(xué)者開始使用時(shí)往往被其復(fù)雜外表所嚇退,其實(shí)GCD的使用非常簡(jiǎn)單,尤其是日常常見的多線程場(chǎng)景。GCD核心的概念是隊(duì)列,我們需要在一個(gè)線程中執(zhí)行某段代碼時(shí),只需要將這段代碼提交給GCD的隊(duì)列,剩下的線程的創(chuàng)建、調(diào)度、運(yùn)行、銷毀等操作,均由GCD幫我們自動(dòng)完成。下面是一個(gè)簡(jiǎn)單的例子:

      例1:

      1 let gQueue : dispatch_queue_t =

      dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 )

      2 // 提交/派發(fā)到全局隊(duì)列,GCD會(huì)負(fù)責(zé)線程調(diào)度

      3 dispatch_async( gQueue,

      4 {

      5 sleep(5)

      6 //在主線程中更改UI

      7 dispatch_async(dispatch_get_main_queue(),

      8 {

      9 self.Label.text = "5秒鐘過(guò)去的新消息"

      10 })

      11 }

      行1聲明了一個(gè)“全局隊(duì)列”,供我們提交線程里運(yùn)行的代碼段。

      行3使用dispatch_async來(lái)提交代碼段到剛聲明的隊(duì)列中,async表示這是一個(gè)異步任務(wù)。

      行7-10的代碼段會(huì)由GCD自動(dòng)創(chuàng)建一個(gè)新的線程,并在新線程中運(yùn)行。

      行7再次提交一個(gè)代碼段,這個(gè)代碼段并不是提交到剛才聲明的全局隊(duì)列中,而是提交到“主隊(duì)列”,主隊(duì)列對(duì)應(yīng)App的主線程,即UI線程;這部分代碼段完成的工作是刷新界面,而刷新界面的操作必須在主線程中完成。

      在例1中,我們接觸到GCD的幾個(gè)基本概念:隊(duì)列、提交,其中,隊(duì)列分為三種:

      1)主隊(duì)列(main):使用dispatch_get_main_queue()獲取,提交到主隊(duì)列的代碼段會(huì)在主線程中運(yùn)行。

      2)全局隊(duì)列(global):使用dispatch_get_global_queue()獲取,提交到全局隊(duì)列的代碼段將在新建線程中運(yùn)行。

      3)用戶創(chuàng)建隊(duì)列(create):使用dispatch_queue_create()創(chuàng)建,用戶隊(duì)列和全局隊(duì)列的區(qū)別是:全局隊(duì)列只有一個(gè),提交的代碼段(線程)是并行運(yùn)行的;用戶隊(duì)列可以創(chuàng)建多個(gè),提交的代碼段(線程)是穿行運(yùn)行的。

      dispatch_async()用于將代碼段提交到指定隊(duì)列,開發(fā)者在提交之后就無(wú)須關(guān)心其他操作了,線程的創(chuàng)建、調(diào)度等操作均由GCD負(fù)責(zé)完成。

      這個(gè)例子雖然簡(jiǎn)單,但這種結(jié)構(gòu)卻幾乎可以占到實(shí)際開發(fā)中GCD使用的50%左右,所有需要在后臺(tái)線程完成業(yè)務(wù)邏輯然后根據(jù)結(jié)果進(jìn)行界面刷新的需求,皆可通過(guò)這種結(jié)構(gòu)來(lái)完成。由此我們可以看到,通過(guò)GCD進(jìn)行多線程編程是極其簡(jiǎn)單方便的,開發(fā)者唯一需要了解的就是GCD的一些基本概念。

      在日常的開發(fā)工作中,我們經(jīng)常會(huì)遇到這樣的需求:在 xx 秒后執(zhí)行某個(gè)方法。比如切換界面 1 秒后開始播放一段動(dòng)畫,或者提示框顯示 3 秒后自動(dòng)消失等等。在 Objective-C 中,我們可以使用一個(gè) NSObject 的實(shí)例方法,-performSelector:withObject:afterDelay: 來(lái)指定在若干時(shí)間后執(zhí)行某個(gè)selector。在Swift中,我們則可以利用NSTimer+GCD來(lái)完成這個(gè)工作,下面是完成這個(gè)需求的進(jìn)行封裝后的代碼段:

      例2:

      import Foundation

      typealias Task = (cancel : Bool) -> Void

      func delay(time:NSTimeInterval, task:()->()) -> Task? {

      func dispatch_later(block:()->()) {

      dispatch_after(

      dispatch_time(

      DISPATCH_TIME_NOW,

      Int64(time * Double(NSEC_PER_SEC))),

      dispatch_get_main_queue(),

      block)

      }

      var closure: dispatch_block_t? = task

      var result: Task?

      let delayedClosure: Task = {

      cancel in

      if let internalClosure = closure {

      if (cancel == false) {

      dispatch_async(dispatch_get_main_queue(), internalClosure);

      }

      }

      closure = nil

      result = nil

      }

      result = delayedClosure

      dispatch_later {

      if let delayedClosure = result {

      delayedClosure(cancel: false)

      }

      }

      return result;

      }

      有了以上的封裝代碼,當(dāng)我們需要完成諸如“延遲3秒后做點(diǎn)什么事兒”的任務(wù)時(shí),只需要簡(jiǎn)單地進(jìn)行以下調(diào)用:

      delay(2) { print("3秒后顯示信息") }

      這個(gè)例子雖然有點(diǎn)長(zhǎng),但是原理和結(jié)構(gòu)與例1基本相同,只不過(guò)增加了dispatch_later()和dispatch_time()兩個(gè)新的調(diào)用,理解了例1之后,例2也是很容易理解的。

      綜上所述,在進(jìn)行Swift開發(fā)時(shí),當(dāng)遇到多線程、異步運(yùn)行、定時(shí)器之類的需求時(shí),我們都可以利用GCD這個(gè)利器來(lái)簡(jiǎn)化我們的工作,同時(shí)兼顧簡(jiǎn)單、快捷和優(yōu)雅。當(dāng)然,GCD的功能并不僅限于以上的介紹,熟練掌握GCD的應(yīng)用,是成熟的iOS程序員必備的技能,每一個(gè)Swift開發(fā)者都應(yīng)該將GCD放入自己的工具箱。

      參考文獻(xiàn):

      [1] Apple Swift官方文檔: https://developer.apple.com/swift/

      [2] Grand Central Dispatch In-Depth: https://www.raywenderlich.com/60749/grand-central-dispatch-in-depth-part-1

      [3] 歐陽(yáng)堅(jiān). Swift開發(fā)實(shí)戰(zhàn)權(quán)威指南[M]. 北京: 清華大學(xué)出版社, 2015.

      猜你喜歡
      多線程
      Java多線程同步機(jī)制在網(wǎng)絡(luò)售票系統(tǒng)中的應(yīng)用
      科技資訊(2016年29期)2017-02-28 09:30:34
      Java并發(fā)工具包對(duì)并發(fā)編程的優(yōu)化
      基于多線程文件傳輸關(guān)鍵技術(shù)研究與實(shí)現(xiàn)
      網(wǎng)頁(yè)爬蟲技術(shù)的關(guān)鍵技術(shù)研究探索
      一種基于多線程的高速磁盤鏡像算法
      iOS并發(fā)程序設(shè)計(jì)中幾種方法的特點(diǎn)及使用技巧研究
      HTM L5 Web WOrker技術(shù)及應(yīng)用研究
      電站鍋爐煤粉參數(shù)遠(yuǎn)程監(jiān)控系統(tǒng)的軟件設(shè)計(jì)與實(shí)現(xiàn)
      一種高并發(fā)認(rèn)證服務(wù)器的實(shí)現(xiàn)
      一種低開銷的并行重復(fù)數(shù)據(jù)刪除算法
      额济纳旗| 桑日县| 衡东县| 高台县| 澎湖县| 洪湖市| 平凉市| 东源县| 锡林浩特市| 西吉县| 芦溪县| 崇仁县| 金川县| 页游| 讷河市| 虞城县| 哈巴河县| 乌拉特后旗| 香河县| 永安市| 罗田县| 河池市| 射洪县| 墨脱县| 平顺县| 辽中县| 凌源市| 诸暨市| 方正县| 苏州市| 岢岚县| 怀安县| 察哈| 贡觉县| 陆川县| 泰宁县| 长海县| 枣阳市| 明水县| 泾阳县| 潜江市|