D56ef7d84a40ed0b342a730b3b33ac7d
跟我学RxSwift01 - RxSwift开篇

RxSwift框架
上图是我用思维导图绘制的框架大致内容,对于初次接触 RxSwift 的人来说,可能会有点懵。不过没关系,下面我会逐一讲解:

RxSwift 是什么

在正式学习 RxSwift 之前,我们有必要知道 RxSwift 是什么?它有什么作用?这样我们才能更好地去了解和掌握它。在了解 RxSwift 之前我们有必要先介绍一下 ReactiveX

ReactiveX(简写: Rx) 是一个可以帮助我们简化异步编程的框架。

它拓展了观察者模式。使你能够自由组合多个异步事件,而不需要去关心线程,同步,线程安全,并发数据以及I/O阻塞。

RxSwift 正是 ReactiveXSwift 版本。

它尝试将原有的一些概念移植到 iOS/macOS 平台。你可以在这里找到跨平台文档 ReactiveX.io


为什么要使用 RxSwift ?

我们先看一下 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)

回调也变得十分简单


除此之外的用法还有: 通知、KVO、设置多个任务之间有依赖关系、等待多个并发任务完成后处理结果 ...... 在这里就不一一列举了,后面再具体讲解时会详细说明。


那么为什么要使用 RxSwift ?

  • 复合 - Rx 就是复合的代名词
  • 复用 - 因为它易复合
  • 清晰 - 因为声明都是不可变更的
  • 易用 - 因为它抽象的了异步编程,使我们统一了代码风格
  • 稳定 - 因为 Rx 是完全通过单元测试的

祝大家学习愉快!!!

下节预告: 跟我学RxSwift02 - RxSwift环境搭建及简单实用

© 著作权归作者所有
这个作品真棒,我要支持一下!
RxSwift系列教程, 从多个方面逐一介绍RxSwift的使用方法,不仅会介绍RxSwift的核心内容: 1. ...
0条评论
top Created with Sketch.