PromiseKit框架详细解析(一) —— 基本概览(一)

版本记录

版本号 时间
V1.0 2018.12.13 星期四

前言

PromiseKit(GitHub地址) 只是 Promise 设计模式的一种实现方式。并不是我们项目中必须采用的一种方式,但是它可以增强代码的可读性和维护性,让代码更加的优雅。接下来我们就一起看一下这个框架。

PromiseKit简介

1. 什么是PromiseKit?

用一句话就是:它是简化异步编程的一种非必要的方式。

PromiseKit 只是 Promise 设计模式的一种实现方式。它不是必须的但是确实可以提高代码的可读性和维护性。但是这并不是必须的,原有的异步编程中的回调块或委托模型完全就够用了,用不用它完全是个人习惯问题。

所谓 Promise 设计模式,是借用生活中的“承诺”一词来描述异步编程中的回调模型。承诺是一种对未来的期许,它有两个特点:

  • 它描述的是未来的一种状态或动作,而不是目前的。
  • 承诺有一定的不确定性,承诺可以兑现(fullfill),也可能被拒绝(rejectd),例如,如果我们编写一个方法从网络获取图片,网络操作一般都是异步的,所以完全适用于承诺模式。所以这个方法就是一个承诺。它不用直接返回一个 Image,而是返回一个承诺对象,只有当网络请求到需要的数据时,这个承诺才会兑现(返回一个 Image 对象给调用者),否则承诺被拒绝(网络错误或者图片不存在),无论兑现还是拒绝,这个承诺对象都会标记为已解决(resolve),已解决的承诺会被销毁。如果既不兑现,也不拒绝,则这个承诺会一直有效(即未解决)。

2. 作者

下面我们就看一下这个框架的作者。


PromiseKit使用

1. OverView

Promise简化了异步编程,使您可以专注于更重要的事情。 它们易于学习,易于掌握,并使代码更清晰,更易读。 你的同事会感谢你。

下面是一个简单的小示例

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是一个深思熟虑且完整的承诺,适用于任何拥有swiftc的平台。 它具有出色的Objective-C桥接功能,适用于iOS,macOS,tvOS和watchOS。 它是世界上许多最受欢迎的应用程序中使用的前100个pod。

2. 版本

截止目前,已经发布了PromiseKit,具体可以参考read the release notes and migration guide

3. 快速开始

Podfile

use_frameworks!

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

上面给出了Xcode警告? 请参阅我们的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)。

对于CarthageSwiftPM等,或者在使用较旧的SwiftsXcode时的说明,请参阅我们的Installation Guide。 我们推荐Carthage

4. Documentation

5. Extensions

Promise仅与它们所代表的异步任务一样有用。 因此,我们已经(几乎)将所有Apple的API转换为promises。 默认的CocoaPodFoundationUIKit提供Promises和扩展。 通过在Podfile中指定其他子规范,可以使用其他扩展名,例如:

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

我们所有的扩展都是PromiseKit organization的独立存储库。

I don't want the extensions!

如果不想要扩展,那么:

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

注意:Carthage安装默认就没有extensions

Choose Your Networking Library

Promise链一般从网络操作开始,因此,我们提供了URLSession的扩展。

// 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
  • 我们现在有JSONDecoder
  • PromiseKit现在有map和其他functional primitives
  • PromiseKit(像Alamofire,但不是raw-URLSession)也默认有回调转到主线程。

我们建议使用vanilla URLSession。 在上述三个要点变为现实之前,Alamofire至关重要,但现在并非如此。


Support

请查看我们的Troubleshooting Guide,如果之后您还有问题,请在我们的Gitter chat channel或我们的our bug tracker上询问。

参考文章

1. PromiseKit 概要
2. PromiseKit 使用

后记

本篇主要讲述了PromiseKit框架的基本概览,感兴趣的给个赞或者关注~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容