亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        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ù)刪除算法
        亚洲最稳定资源在线观看| 日韩精品免费一区二区三区观看| 亚洲最好看的中文字幕| 国产无套粉嫩白浆在线观看| 亚洲av综合日韩| 精品视频在线观看免费无码| 亚洲日本精品一区久久精品| 日产一区二区三区的精品| 懂色av一区二区三区尤物| 日本一级二级三级在线| 桃色一区一区三区蜜桃视频| 国产一区二区三区啊啊| 日本欧美大码a在线观看| 岳毛多又紧做起爽| 欧美国产成人精品一区二区三区| 无码免费午夜福利片在线| 国产一区二区三区av观看| 人成综合视频在线播放| 精品区2区3区4区产品乱码9| 国产肉体ⅹxxx137大胆| 杨幂Av一区二区三区| 色婷婷在线一区二区三区| 曰韩少妇内射免费播放| 黑人巨大无码中文字幕无码| 久久精品一品道久久精品9| 久久精品这里就是精品| 国产精品亚洲精品一区二区| 大桥未久av一区二区三区| 久久精品国产亚洲av高清热| 国产精品18久久久久久麻辣| 亚洲a级片在线观看| 窄裙美女教师在线观看视频| 国产人妖xxxx做受视频| 男男做h嗯啊高潮涩涩| 人与人性恔配视频免费| 日本公妇在线观看中文版| 日韩偷拍一区二区三区视频| 一亚洲一区二区中文字幕| 亚洲色图专区在线视频| 午夜视频在线瓜伦| 午夜内射中出视频|