iOS開發(fā)中使用Swift來完成異步事件

異步事件編程坦仍,其實(shí)并不是什么新東西了,基本所有涉及到GUI的叨襟,網(wǎng)絡(luò)請(qǐng)求的繁扎,數(shù)據(jù)庫讀寫的,都會(huì)有它的身影糊闽。

異步事件梳玫,就是說這一個(gè)代碼或者代碼塊,并不會(huì)阻塞程序的運(yùn)行右犹,程序會(huì)立即執(zhí)行下一條語句提澎,而這條語句,會(huì)在相應(yīng)的方法調(diào)用結(jié)束之后念链,執(zhí)行它自身的回調(diào)函數(shù)發(fā)送一些信號(hào)盼忌,來表明這個(gè)異步事件完成积糯。就像你約會(huì)提前1小時(shí)到見面地點(diǎn),先去買點(diǎn)東西踩點(diǎn)什么的(……)谦纱,等GF/BF到了之后短信通知你看成,你就立即回來。而不是一直在原地等到對(duì)方過來(……)

最早使用異步開發(fā)跨嘉,是在使用JavaScript來開發(fā)Web前端的時(shí)候川慌,XMLHttpRequest或者jQuery$.ajax中,都會(huì)用到回調(diào)函數(shù)祠乃,來指明成功或者失敗之后的處理方法梦重。當(dāng)對(duì)應(yīng)的網(wǎng)絡(luò)請(qǐng)求得到響應(yīng)之后,會(huì)調(diào)用響應(yīng)的成功或者失敗的回調(diào)函數(shù)亮瓷,然后執(zhí)行里面相應(yīng)的方法琴拧,這大大提升了前端的效率,不會(huì)在網(wǎng)絡(luò)請(qǐng)求時(shí)整個(gè)頁面卡住嘱支,而且也不需要一次次輪詢看是否有響應(yīng)艾蓝,簡(jiǎn)化了代碼的復(fù)雜性。

這點(diǎn)Node.js中更為常見斗塘,不過也更能表現(xiàn)中濫用異步事件編程的問題。新人使用Node.js總會(huì)發(fā)現(xiàn)基本任何東西都是異步的亮靴,數(shù)據(jù)庫是異步的馍盟,IO文件操作是異步的,Session讀寫是異步的茧吊,甚至獲得Request對(duì)象都是異步的贞岭。這就導(dǎo)致很多人一直在嵌套回調(diào)函數(shù),導(dǎo)致了著名的Callback Hell

在Node.js中搓侄,解決方案有非常成熟的Async瞄桨,更有號(hào)稱能用同步思維寫異步的Promises,都是非常棒的解決方案讶踪。前者的本質(zhì)就是一個(gè)自動(dòng)生成回調(diào)的封裝……芯侥,后者則是一個(gè)真正意義上的全新的解決方案。

而在Swift和iOS開發(fā)中乳讥,也有必須用到異步事件編程的地方柱查。除了View層的簡(jiǎn)單UI和Controller之間的交互以外(這部分一般不需要手寫代碼處理異步交互或者順序),其他很多地方需要這些知識(shí)云石。例如網(wǎng)絡(luò)請(qǐng)求的異步調(diào)用唉工,請(qǐng)求隊(duì)列的處理(雖然可以一個(gè)網(wǎng)絡(luò)請(qǐng)求就是一個(gè)線程,但這種方法的效率不高汹忠,而且容易導(dǎo)致線程間沖突)淋硝,SQLite數(shù)據(jù)庫大量數(shù)據(jù)的讀寫雹熬,本地存儲(chǔ)的大量數(shù)據(jù)讀寫,復(fù)雜UI的渲染順序等等……這些都是需要進(jìn)行異步編程的谣膳,而不能讓同步的代碼阻塞住整個(gè)應(yīng)用或者UI竿报。

舉個(gè)例子,這里是一個(gè)UI順序加載的動(dòng)畫……

func schoolLifeClicked()
{
    var mydrawerController = self.mm_drawerController //一個(gè)用TableView實(shí)現(xiàn)的應(yīng)用側(cè)邊欄抽屜View
    let schoolLifeViewController:SchoolLifeViewController = SchoolLifeViewController(nibName: "SchoolLifeViewController", bundle: nil)
    let navSchoolLifeViewController = CommonNavViewController(rootViewController: schoolLifeViewController)

    self.mm_drawerController.toggleDrawerSide(MMDrawerSide.Left, animated: true, completion:{(complete) in
        if complete{//如果成功拉出抽屜
            mydrawerController.setCenterViewController(navSchoolLifeViewController, withCloseAnimation: true, completion: nil)//設(shè)置主視圖
            mydrawerController.closeDrawerAnimated(true, completion:nil)//關(guān)閉抽屜
        }
    })//一個(gè)閉包参歹,成功后調(diào)用
}

可以看到仰楚,Swift很多時(shí)候也可以依靠回調(diào)函數(shù),把一個(gè)閉包扔進(jìn)去當(dāng)參數(shù)犬庇,然后執(zhí)行僧界,從而控制這種異步事件的流程……

但是,這種方法寫起來臭挽,就會(huì)回到和JS那種匿名函數(shù)閉包扔進(jìn)去當(dāng)參數(shù)一樣捂襟,小范圍用還可以,一旦你要進(jìn)行復(fù)雜的流程控制欢峰,比如一系列異步事件葬荷,AB同時(shí)執(zhí)行,AB同時(shí)完成后執(zhí)行C纽帖,C執(zhí)行完成后執(zhí)行D……這種控制下寫出來的代碼和JavaScript的callback hell是一樣的宠漩,難以維護(hù)。

怎么辦呢懊直?其實(shí)自己實(shí)現(xiàn)一個(gè)語法糖或者函數(shù)隊(duì)列來執(zhí)行也不難扒吁,不過這里可以推薦一下GitHub上非常厲害的庫,大家有興趣也要認(rèn)真看看源碼(雖然源碼是Objective-C的……但是慢慢來)
鏈接:
Async這個(gè)利用了OS X 10.10和iOS8的GCD技術(shù)室囊,只能在這個(gè)平臺(tái)以上
Async.legacy兼容OS X 10.9和iOS7

怎么使用呢雕崩?參考人家的Readme,用語法糖可以很簡(jiǎn)單的使用:

Async.userInitiated {
    println("start")
}.main {
    println("1")
}.background {
    println("2")
}.background {
    println("2 all the same")
}.main {
    println("stop")
}

由于異步事件的特點(diǎn)融撞,所以整個(gè)輸出可能就會(huì)是

start
1
2
stop
2 all the same

不要大驚小怪哦盼铁。利用這個(gè)就可以從繁重的callback中解放出來,簡(jiǎn)單的處理異步事件的順序尝偎,并且獲得很高的性能饶火,這也是網(wǎng)絡(luò)請(qǐng)求和數(shù)據(jù)庫訪問等必須要考慮的地方……

最后,我還是多看看關(guān)于異步事件致扯,閉包的知識(shí)趁窃,對(duì)這些知識(shí)有了更深的了解,不僅對(duì)iOS開發(fā)急前,對(duì)Web開發(fā)醒陆,客戶端開發(fā),并行計(jì)算算法的實(shí)現(xiàn)等都會(huì)十分有幫助裆针。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刨摩,一起剝皮案震驚了整個(gè)濱河市寺晌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌澡刹,老刑警劉巖呻征,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異罢浇,居然都是意外死亡陆赋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門嚷闭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來攒岛,“玉大人,你說我怎么就攤上這事胞锰≡志猓” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵嗅榕,是天一觀的道長(zhǎng)顺饮。 經(jīng)常有香客問我,道長(zhǎng)凌那,這世上最難降的妖魔是什么兼雄? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮帽蝶,結(jié)果婚禮上赦肋,老公的妹妹穿的比我還像新娘。我一直安慰自己嘲碱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布局蚀。 她就那樣靜靜地躺著麦锯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪琅绅。 梳的紋絲不亂的頭發(fā)上扶欣,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音千扶,去河邊找鬼料祠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛澎羞,可吹牛的內(nèi)容都是我干的髓绽。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼妆绞,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼顺呕!你這毒婦竟也來了枫攀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤株茶,失蹤者是張志新(化名)和其女友劉穎来涨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體启盛,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蹦掐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了僵闯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卧抗。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖棍厂,靈堂內(nèi)的尸體忽然破棺而出颗味,到底是詐尸還是另有隱情,我是刑警寧澤牺弹,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布浦马,位于F島的核電站,受9級(jí)特大地震影響张漂,放射性物質(zhì)發(fā)生泄漏晶默。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一航攒、第九天 我趴在偏房一處隱蔽的房頂上張望磺陡。 院中可真熱鬧,春花似錦漠畜、人聲如沸币他。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝴悉。三九已至,卻和暖如春瘾敢,著一層夾襖步出監(jiān)牢的瞬間拍冠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工簇抵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留庆杜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓碟摆,卻偏偏與公主長(zhǎng)得像晃财,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子典蜕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,867評(píng)論 25 707
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,135評(píng)論 30 470
  • __block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用拓劝,...
    LZM輪回閱讀 3,293評(píng)論 0 6
  • 2017-01-24 從記事開始郑临,我就一直做惡夢(mèng): 夢(mèng)見自己從樓梯上摔下來栖博,然后一直往下掉,掉入深淵; 夢(mèng)見二層樓...
    靜宇藍(lán)歆閱讀 288評(píng)論 0 0
  • 提筆想要寫些什么厢洞。 上一次這樣的想法仇让,最少是在七年前了。 而再上一次躺翻,提筆在淡淡書香的紙張上寫些什么的時(shí)間丧叽,應(yīng)該是...
    畫個(gè)小書簽閱讀 329評(píng)論 1 4