美文网首页
PromiseKit框架(swift版)实践

PromiseKit框架(swift版)实践

作者: 我的发 | 来源:发表于2019-11-14 21:01 被阅读0次

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

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

    • CorePromise


      image.png
    • Foundation拓展


      image.png
    • UIKit拓展


      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版)实践

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