PromiseKit框架詳細(xì)解析(一) —— 基本概覽(一)

版本記錄

版本號(hào) 時(shí)間
V1.0 2018.12.13 星期四

前言

PromiseKit(GitHub地址) 只是 Promise 設(shè)計(jì)模式的一種實(shí)現(xiàn)方式。并不是我們項(xiàng)目中必須采用的一種方式蓖捶,但是它可以增強(qiáng)代碼的可讀性和維護(hù)性匹舞,讓代碼更加的優(yōu)雅葱轩。接下來(lái)我們就一起看一下這個(gè)框架。

PromiseKit簡(jiǎn)介

1. 什么是PromiseKit狠毯?

用一句話就是:它是簡(jiǎn)化異步編程的一種非必要的方式护糖。

PromiseKit 只是 Promise 設(shè)計(jì)模式的一種實(shí)現(xiàn)方式。它不是必須的但是確實(shí)可以提高代碼的可讀性和維護(hù)性嚼松。但是這并不是必須的嫡良,原有的異步編程中的回調(diào)塊或委托模型完全就夠用了,用不用它完全是個(gè)人習(xí)慣問(wèn)題献酗。

所謂 Promise 設(shè)計(jì)模式寝受,是借用生活中的“承諾”一詞來(lái)描述異步編程中的回調(diào)模型。承諾是一種對(duì)未來(lái)的期許罕偎,它有兩個(gè)特點(diǎn):

  • 它描述的是未來(lái)的一種狀態(tài)或動(dòng)作很澄,而不是目前的。
  • 承諾有一定的不確定性颜及,承諾可以?xún)冬F(xiàn)(fullfill)甩苛,也可能被拒絕(rejectd),例如俏站,如果我們編寫(xiě)一個(gè)方法從網(wǎng)絡(luò)獲取圖片讯蒲,網(wǎng)絡(luò)操作一般都是異步的,所以完全適用于承諾模式肄扎。所以這個(gè)方法就是一個(gè)承諾墨林。它不用直接返回一個(gè) Image,而是返回一個(gè)承諾對(duì)象犯祠,只有當(dāng)網(wǎng)絡(luò)請(qǐng)求到需要的數(shù)據(jù)時(shí)旭等,這個(gè)承諾才會(huì)兌現(xiàn)(返回一個(gè) Image 對(duì)象給調(diào)用者),否則承諾被拒絕(網(wǎng)絡(luò)錯(cuò)誤或者圖片不存在)衡载,無(wú)論兌現(xiàn)還是拒絕搔耕,這個(gè)承諾對(duì)象都會(huì)標(biāo)記為已解決(resolve),已解決的承諾會(huì)被銷(xiāo)毀月劈。如果既不兌現(xiàn)度迂,也不拒絕藤乙,則這個(gè)承諾會(huì)一直有效(即未解決)。

2. 作者

下面我們就看一下這個(gè)框架的作者惭墓。


PromiseKit使用

1. OverView

Promise簡(jiǎn)化了異步編程坛梁,使您可以專(zhuān)注于更重要的事情。 它們易于學(xué)習(xí)腊凶,易于掌握划咐,并使代碼更清晰,更易讀钧萍。 你的同事會(huì)感謝你褐缠。

下面是一個(gè)簡(jiǎn)單的小示例

UIApplication.shared.isNetworkActivityIndicatorVisible = true

let fetchImage = URLSession.shared.dataTask(.promise, with: url).compactMap{ UIImage(data: $0.data) }
let fetchLocation = CLLocationManager.requestLocation().lastValue

firstly {
    when(fulfilled: fetchImage, fetchLocation)
}.done { image, location in
    self.imageView.image = image
    self.label.text = "\(location)"
}.ensure {
    UIApplication.shared.isNetworkActivityIndicatorVisible = false
}.catch { error in
    self.show(UIAlertController(for: error), sender: self)
}

PromiseKit是一個(gè)深思熟慮且完整的承諾,適用于任何擁有swiftc的平臺(tái)风瘦。 它具有出色的Objective-C橋接功能队魏,適用于iOS,macOS万搔,tvOS和watchOS胡桨。 它是世界上許多最受歡迎的應(yīng)用程序中使用的前100個(gè)pod。

2. 版本

截止目前瞬雹,已經(jīng)發(fā)布了PromiseKit昧谊,具體可以參考read the release notes and migration guide

3. 快速開(kāi)始

Podfile

use_frameworks!

target "Change Me!" do
  pod "PromiseKit", "~> 6.0"
end

上面給出了Xcode警告酗捌? 請(qǐng)參閱我們的Installation Guide

PromiseKit 6,5和4支持Xcode 8.3,9.x和10.0呢诬;Swift 3.1,3.2,3.3,3.4,4.0,4.1和4.2;iOS胖缤,macOS尚镰,tvOS,watchOS哪廓,Linux和Android钓猬;CocoaPods,Carthage和SwiftPM撩独;(CI Matrix)。

對(duì)于Carthage账月,SwiftPM等综膀,或者在使用較舊的SwiftsXcode時(shí)的說(shuō)明,請(qǐng)參閱我們的Installation Guide局齿。 我們推薦Carthage剧劝。

4. Documentation

5. Extensions

Promise僅與它們所代表的異步任務(wù)一樣有用。 因此抓歼,我們已經(jīng)(幾乎)將所有Apple的API轉(zhuǎn)換為promises讥此。 默認(rèn)的CocoaPodFoundationUIKit提供Promises和擴(kuò)展拢锹。 通過(guò)在Podfile中指定其他子規(guī)范,可以使用其他擴(kuò)展名萄喳,例如:

pod "PromiseKit/MapKit"          # MKDirections().calculate().then { /*…*/ }
pod "PromiseKit/CoreLocation"    # CLLocationManager.requestLocation().then { /*…*/ }

我們所有的擴(kuò)展都是PromiseKit organization的獨(dú)立存儲(chǔ)庫(kù)卒稳。

I don't want the extensions!

如果不想要擴(kuò)展,那么:

pod "PromiseKit/CorePromise", "~> 6.0"

注意:Carthage安裝默認(rèn)就沒(méi)有extensions他巨。

Choose Your Networking Library

Promise鏈一般從網(wǎng)絡(luò)操作開(kāi)始充坑,因此,我們提供了URLSession的擴(kuò)展染突。

// pod 'PromiseKit/Foundation'  # https://github.com/PromiseKit/Foundation

firstly {
    URLSession.shared.dataTask(.promise, with: try makeUrlRequest()).validate()
    // ^^ we provide `.validate()` so that eg. 404s get converted to errors
}.map {
    try JSONDecoder().decode(Foo.self, with: $0.data)
}.done { foo in
    //…
}.catch { error in
    //…
}

func makeUrlRequest() throws -> URLRequest {
    var rq = URLRequest(url: url)
    rq.httpMethod = "POST"
    rq.addValue("application/json", forHTTPHeaderField: "Content-Type")
    rq.addValue("application/json", forHTTPHeaderField: "Accept")
    rq.httpBody = try JSONEncoder().encode(obj)
    return rq
}

Alamofire

// pod 'PromiseKit/Alamofire'  # https://github.com/PromiseKit/Alamofire-

firstly {
    Alamofire
        .request("http://example.com", method: .post, parameters: params)
        .responseDecodable(Foo.self)
}.done { foo in
    //…
}.catch { error in
    //…
}

如今捻爷,考慮到:

  • 我們幾乎總是POST JSON
  • 我們現(xiàn)在有JSONDecoder
  • PromiseKit現(xiàn)在有map和其他functional primitives
  • PromiseKit(像Alamofire,但不是raw-URLSession)也默認(rèn)有回調(diào)轉(zhuǎn)到主線程份企。

我們建議使用vanilla URLSession也榄。 在上述三個(gè)要點(diǎn)變?yōu)楝F(xiàn)實(shí)之前,Alamofire至關(guān)重要司志,但現(xiàn)在并非如此甜紫。


Support

請(qǐng)查看我們的Troubleshooting Guide,如果之后您還有問(wèn)題俐芯,請(qǐng)?jiān)谖覀兊?a target="_blank" rel="nofollow">Gitter chat channel或我們的our bug tracker上詢(xún)問(wèn)棵介。

參考文章

1. PromiseKit 概要
2. PromiseKit 使用

后記

本篇主要講述了PromiseKit框架的基本概覽,感興趣的給個(gè)贊或者關(guān)注~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吧史,一起剝皮案震驚了整個(gè)濱河市冰蘑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌永乌,老刑警劉巖橙弱,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異钞脂,居然都是意外死亡揣云,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)冰啃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)邓夕,“玉大人,你說(shuō)我怎么就攤上這事阎毅》俑眨” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵扇调,是天一觀的道長(zhǎng)矿咕。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么碳柱? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任捡絮,我火速辦了婚禮,結(jié)果婚禮上莲镣,老公的妹妹穿的比我還像新娘福稳。我一直安慰自己,他們只是感情好剥悟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布灵寺。 她就那樣靜靜地躺著,像睡著了一般区岗。 火紅的嫁衣襯著肌膚如雪略板。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天慈缔,我揣著相機(jī)與錄音叮称,去河邊找鬼。 笑死藐鹤,一個(gè)胖子當(dāng)著我的面吹牛瓤檐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播娱节,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼挠蛉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了肄满?” 一聲冷哼從身側(cè)響起谴古,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稠歉,沒(méi)想到半個(gè)月后掰担,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怒炸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年带饱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阅羹。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡勺疼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捏鱼,到底是詐尸還是另有隱情恢口,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布穷躁,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏问潭。R本人自食惡果不足惜猿诸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望狡忙。 院中可真熱鬧梳虽,春花似錦、人聲如沸灾茁。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)北专。三九已至禀挫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拓颓,已是汗流浹背语婴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留驶睦,地道東北人砰左。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像场航,于是被迫代替她去往敵國(guó)和親缠导。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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