zoukankan      html  css  js  c++  java
  • [RxSwift]1、为什么要使用 RxSwift ?

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(let_us_code)
    ➤博主域名:https://www.zengqiang.org
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/13563345.html
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    热烈欢迎,请直接点击!!!

    进入博主App Store主页,下载使用各个作品!!!

    注:博主将坚持每月上线一个新app!!!

    我们先看一下 RxSwift 能够帮助我们做些什么:

    Target Action

    传统实现方法:

    button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
    
    func buttonTapped() {
        print("button Tapped")
    }
    

    通过 Rx 来实现:

    button.rx.tap
        .subscribe(onNext: {
            print("button Tapped")
        })
        .disposed(by: disposeBag)
    

    你不需要使用 Target Action,这样使得代码逻辑清晰可见。

    代理

    传统实现方法:

    class ViewController: UIViewController {
        ...
        override func viewDidLoad() {
            super.viewDidLoad()
            scrollView.delegate = self
        }
    }
    
    extension ViewController: UIScrollViewDelegate {
        func scrollViewDidScroll(_ scrollView: UIScrollView) {
            print("contentOffset: (scrollView.contentOffset)")
        }
    }
    

    通过 Rx 来实现:

    class ViewController: UIViewController {
        ...
        override func viewDidLoad() {
            super.viewDidLoad()
    
            scrollView.rx.contentOffset
                .subscribe(onNext: { contentOffset in
                    print("contentOffset: (contentOffset)")
                })
                .disposed(by: disposeBag)
        }
    }
    

    你不需要书写代理的配置代码,就能获得想要的结果。

    闭包回调

    传统实现方法:

    URLSession.shared.dataTask(with: URLRequest(url: url)) {
        (data, response, error) in
        guard error == nil else {
            print("Data Task Error: (error!)")
            return
        }
    
        guard let data = data else {
            print("Data Task Error: unknown")
            return
        }
    
        print("Data Task Success with count: (data.count)")
    }.resume()
    

    通过 Rx 来实现:

    URLSession.shared.rx.data(request: URLRequest(url: url))
        .subscribe(onNext: { data in
            print("Data Task Success with count: (data.count)")
        }, onError: { error in
            print("Data Task Error: (error)")
        })
        .disposed(by: disposeBag)
    

    回调也变得十分简单

    通知

    传统实现方法:

    var ntfObserver: NSObjectProtocol!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        ntfObserver = NotificationCenter.default.addObserver(
              forName: .UIApplicationWillEnterForeground,
              object: nil, queue: nil) { (notification) in
            print("Application Will Enter Foreground")
        }
    }
    
    deinit {
        NotificationCenter.default.removeObserver(ntfObserver)
    }
    

    通过 Rx 来实现:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        NotificationCenter.default.rx
            .notification(.UIApplicationWillEnterForeground)
            .subscribe(onNext: { (notification) in
                print("Application Will Enter Foreground")
            })
            .disposed(by: disposeBag)
    }
    

    你不需要去管理观察者的生命周期,这样你就有更多精力去关注业务逻辑。

    多个任务之间有依赖关系

    例如,先通过用户名密码取得 Token 然后通过 Token 取得用户信息,

    传统实现方法:

    /// 用回调的方式封装接口
    enum API {
    
        /// 通过用户名密码取得一个 token
        static func token(username: String, password: String,
            success: (String) -> Void,
            failure: (Error) -> Void) { ... }
    
        /// 通过 token 取得用户信息
        static func userinfo(token: String,
            success: (UserInfo) -> Void,
            failure: (Error) -> Void) { ... }
    }
    
    /// 通过用户名和密码获取用户信息
    API.token(username: "beeth0ven", password: "987654321",
        success: { token in
            API.userInfo(token: token,
                success: { userInfo in
                    print("获取用户信息成功: (userInfo)")
                },
                failure: { error in
                    print("获取用户信息失败: (error)")
            })
        },
        failure: { error in
            print("获取用户信息失败: (error)")
    })
    

    通过 Rx 来实现:

    /// 用 Rx 封装接口
    enum API {
    
        /// 通过用户名密码取得一个 token
        static func token(username: String, password: String) -> Observable<String> { ... }
    
        /// 通过 token 取得用户信息
        static func userInfo(token: String) -> Observable<UserInfo> { ... }
    }
    
    /// 通过用户名和密码获取用户信息
    API.token(username: "beeth0ven", password: "987654321")
        .flatMapLatest(API.userInfo)
        .subscribe(onNext: { userInfo in
            print("获取用户信息成功: (userInfo)")
        }, onError: { error in
            print("获取用户信息失败: (error)")
        })
        .disposed(by: disposeBag)
    

    这样你可以避免回调地狱,从而使得代码易读,易维护。

    等待多个并发任务完成后处理结果

    例如,需要将两个网络请求合并成一个,

    通过 Rx 来实现:

    /// 用 Rx 封装接口
    enum API {
    
        /// 取得老师的详细信息
        static func teacher(teacherId: Int) -> Observable<Teacher> { ... }
    
        /// 取得老师的评论
        static func teacherComments(teacherId: Int) -> Observable<[Comment]> { ... }
    }
    
    /// 同时取得老师信息和老师评论
    Observable.zip(
          API.teacher(teacherId: teacherId),
          API.teacherComments(teacherId: teacherId)
        ).subscribe(onNext: { (teacher, comments) in
            print("获取老师信息成功: (teacher)")
            print("获取老师评论成功: (comments.count) 条")
        }, onError: { error in
            print("获取老师信息或评论失败: (error)")
        })
        .disposed(by: disposeBag)
    

    这样你可用寥寥几行代码来完成相当复杂的异步操作。


    那么为什么要使用 RxSwift ?

    • 复合 - Rx 就是复合的代名词
    • 复用 - 因为它易复合
    • 清晰 - 因为声明都是不可变更的
    • 易用 - 因为它抽象的了异步编程,使我们统一了代码风格
    • 稳定 - 因为 Rx 是完全通过单元测试的
  • 相关阅读:
    hdu3001 Travelling
    android 对一个合并后的联系人选择编辑,手机屏幕会缓慢变暗后再进入编辑界面的问题
    数组指针与指针数组 函数指针与指针函数
    CF:322D
    QRadioButton类中Toggled()信号的使用方法
    Android---App Widget(四)
    github 坑爹的仓库初始化设置
    Failed to load session “ubuntu” -- 12.04
    Linux下的图形界面——X Window的安装
    用户管理操作示例
  • 原文地址:https://www.cnblogs.com/strengthen/p/13563345.html
Copyright © 2011-2022 走看看