PromiseKit框架(swift版)实践

周所周知PromiseKit是个链式异步框架,用过 masnory的都知道链式异步的好处。该框架有OC和swift版本,这里主要介绍的是swift版本使用的。

源码目录预览,主要分为如下3部分

  • CorePromise


    PromiseKit框架(swift版)实践_第1张图片
    image.png
  • Foundation拓展


    PromiseKit框架(swift版)实践_第2张图片
    image.png
  • UIKit拓展


    PromiseKit框架(swift版)实践_第3张图片
    image.png

Foundation拓展的使用

由头文件可知,主要是扩展了NSNotificationCenter(通知)NSURLSession(网络请求)NSObject+Promise(KVO的扩展)NSTask(非iOS类,macOS才能用) 下面就来介绍前面3种的用法。

NSNotificationCenter(通知)的使用

常见的做法
// 监听通知
NotificationCenter.default.addObserver(self, selector: #selector(test), name: NSNotification.Name(rawValue:"kNotificationKey"), object: nil)
// do your job
func test(nofi : Notification) {
      let str = nofi.userInfo!["post"]
      print(String(describing: str!) + "this notifi")
 }

//发起通知
NotificationCenter.default.post(name: NSNotification.Name("kNotificationKey"), object: self, userInfo: ["post":"NewTest"])
Promise的做法
// 监听名字为kNotificationKey的通知
NotificationCenter.default.observe(once: Notification.Name(rawValue: "kNotificationKey")).done { notification in
            // TODO: get notification, do your job

            // 需要注意Promise的做法只会观察一次,如果需要继续观察,要手动再次注册self.beginObserver()
            self.beginObserver()
}
//发起通知
NotificationCenter.default.post(name: NSNotification.Name("kNotificationKey"), object: self, userInfo: ["post":"NewTest"])
总结:通过上面的代码段比较,可以看到Promise的做法在监听的地方直接在闭包获取监听的值,不像系统还需要单独声明一个方法去处理数据的回调。Promise使得逻辑、业务都能紧密结合在一起,让代码易读性更高。(除此之外Promise 还能在指定线程接收数据done(on: <#T##DispatchQueue?#>, flags: <#T##DispatchWorkItemFlags?#>, <#T##body: (Void) -> Void##(Void) -> Void#>)

NSURLSession(网络请求)

系统原生的做法
//创建URLRequest对象
let request = URLRequest(url: URL(string:"https://httpbin.org/get?foo=bar")!)
        
// 原生的网络请求
let task = URLSession.shared.dataTask(with: request) { ( data, urlRespone, error) in
            if !(data == nil) && (error == nil)  {
                let res =  self.nwDataParsing(data: data!)
                print(res)
            }
}
task.resume()
Promise的做法
//创建URLRequest对象
let request = URLRequest(url: URL(string:"https://httpbin.org/get?foo=bar")!)
        
 // Promise的做法
 _ = URLSession.shared.dataTask(.promise, with: request)
            .validate()
            .done { data, response in
            print(self.nwDataParsing(data: data))
}
总结:上面的代码段是一个简单的网络请求,swift已经是比OC简洁了很多的语言了,但原生的网络请求还是需要3行的代码才能处理一个请求。而Promise 省略掉了 task.resume() 累赘,将请求结果在闭包里面整合了,接下来只属于对数据进行过滤即可。

NSObject+Promise(KVO的扩展)

class ViewController: UIViewController {

@objc var m_button = UIButton.init(type: .custom)
@objc dynamic var m_titleNum = 1 // 必须要加@objc关键词以及对象标记为dynamic,因为Swift 4不再自动给NSObject的子类添加@objec,刚学swift被这两个玩意坑死了。。。

override func viewDidLoad() {
    super.viewDidLoad()

        // 系统原生的做法
        self.addObserver(self, forKeyPath: "m_titleNum", options: .new, context: nil)
        
        // promise的做法
        PromiseObserve()
}
系统原生的做法
self.addObserver(self, forKeyPath: "m_titleNum", options: .new, context: nil)

 // 系统原生的做法,监听
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        print("系统原生的做法监听到了 \(change![NSKeyValueChangeKey.newKey]!)")
 }
Promise的做法
func PromiseObserve() {
        self.observe(.promise, keyPath: #keyPath(m_titleNum)).done { value in
            print(" PromiseObserve + \(value ?? "") ")
            //继续观察
            self.PromiseObserve()
        }
}
总结:系统原生的KVO又要注意监听对象和监听者的关系,又要重写observeValue: 方法获取监听的数据,代码会到处散乱。而Promise还是那么优雅、简洁、易读。

经过三种系统原生和Promise的具体场景用法比较,Promise给我的感受就和它的名字一样保证(承诺),答应帮我做的工作都能完成,然后清楚的摆在我眼前,我只需要相信它就好。PromiseKit就是是高内聚、低耦合编程思想的体现。

Demo地址: https://github.com/sushushu/PromiseKitUage-swift-

你可能感兴趣的:(PromiseKit框架(swift版)实践)