美文网首页适配
PromiseKit框架详细解析(一) —— 基本概览(一)

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

作者: 刀客传奇 | 来源:发表于2018-12-13 12:08 被阅读171次

    版本记录

    版本号 时间
    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框架的基本概览,感兴趣的给个赞或者关注~~~

    相关文章

      网友评论

        本文标题:PromiseKit框架详细解析(一) —— 基本概览(一)

        本文链接:https://www.haomeiwen.com/subject/nxdvhqtx.html