版本記錄
版本號(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
等综膀,或者在使用較舊的Swifts
或Xcode
時(shí)的說(shuō)明,請(qǐng)參閱我們的Installation Guide局齿。 我們推薦Carthage剧劝。
4. Documentation
-
Handbook
-
Manual
- Installation Guide
- Objective-C Guide
- Troubleshooting (e.g., solutions to common compile errors)
- Appendix
- API Reference
5. Extensions
Promise
僅與它們所代表的異步任務(wù)一樣有用。 因此抓歼,我們已經(jīng)(幾乎)將所有Apple的API轉(zhuǎn)換為promises
讥此。 默認(rèn)的CocoaPod
為Foundation
和UIKit
提供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
}
// 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)注~~~