ReactiveX/RxSwift 初见

ReactiveX 的不同之处

我们习以为常的编码大多是通过KVO、Notification、Delegate、Block监听程序的变化,以此来达到我们想要达到的传值、改变UI等操作。现在有了ReactiveX,它可以帮助我们让代码自动相应更新,程序可以对底层数据的变化做出响应。

以下我们谈谈RxSwift

我们在编写iOS程序的时候,UI便是第一步,最常用的几个控件

UILabel

Before RxSwift

// 我们要让label显示tip的文字

tip = "以往的方式"
label.text = tip
// 改变tip的值
tip = "现在的方式"
label.text = tip

After RxSwift

tip = Variable<String>("以往的方式")

tip.asObservable()
.bind(to: label.rx.text)
.disposed(by: bag)

tip.value = "现在的方式"

UIButton

Before RxSwift

button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)

func buttonAction() {
    ...
}

After RxSwift

button.rx.tap.subscribe(onNext: {
    ...
})

甚至 Notification

Before RxSwift

NotificationCenter.default.addObserver(self, selector: #selector(beginEditing(_:)), name: NSNotification.Name.UITextViewTextDidBeginEditing, object: nil)

func beginEditing(_ sender: Notification) {
    ...
}

After RxSwift

NotificationCenter.default
    .rx.notification(NSNotification.Name.UITextViewTextDidBeginEditing, object: myTextView)
    .map {  /*do something with data*/ }

以上便是响应式编程的优雅之处,不需要定义多余的变量方法,不需要重复的去复制操作UI变化,省去了开发过程中各种细碎的状态的维护,以往的种种烦恼在此时,便都烟消云散liao。

ReactiveX的一些重点

Observables和Observers
  • Observable是发生变化的对象
  • Observer是接收变化通知的对象

多个Observer可以监听同一个Observable,Observable发生变化时会通知所有订阅的Observer

Observable也相当于事件管道,会向订阅者发送事件信息。事件分为三种:

  • .Next(value) 有新的数据。
  • .Completed 管道已经结束。
  • .Error 有异常发生导致事件管道结束。

例如一个网络请求,收到服务端返回的数据后会发送.Next,因为请求都是一次性的,所以Next发送完后会马上发送Completed。如果请求超时了则会发送Error

DisposeBag

DisposeBagRxSwift提供的用来管理内存的工具。

当带有DisposeBag属性的对象调用deinit()时,bag将被清空,且每一个Observer会自动取消订阅它所观察的对象。理念类似于autoreleasepool

如果没有DisposeBag,则会产生retain cycle,或者被意外释放掉,导致程序Crash

let _disposeBag = DisposeBag()

Observable.just("123").subscribe(onNext: { (item) in

}).addDisposableTo(_disposeBag)
Disposables.create

每个Observable都要求Disposable类型的返回值,通过Disposables.create便能创建Disposable的实例,当Observable被释放时会执行Disposable,相当于析构函数。

Observable.create

实际开发中用的最多的函数,创建一个Observable

Observable.create { (observer) -> Disposable in
    ...
    if (error) {
        observer.on(.error(RxSwiftError.unknown))
    } else {
        observer.on(.next(value))
        observer.on(.completed)
    }
    return Disposables.create {

    }
}
Observable.just

just只会发送一条数据,它先发送一次.Next(value),然后发送.Completed

Observable.empty

empty是空管道,它只会发送.Completed消息。

Observable.deferred

deferred会等到有Observer的时候再去创建Observable,相当于懒加载,而且每个订阅者订阅的对象都是内容相同但指针不同的Observable

Subjects

SubjetObservableObserver之间的桥梁,它既是Obserable又是Observer,既可以发出事件,也可以订阅事件。

PublishSubject只能收到订阅它之后的事件,订阅之前的事件无法收到。

Debug

打印所有订阅、事件、Disposable

sequenceThatErrors
    .retry(3)
    .debug()
    .subscribe(onNext: { print($0) })
    .addDisposableTo(disposeBag)
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值