RxSwift观察者AnyObserver、Binder的使用

简介: RxSwift观察者AnyObserver、Binder的使用


01. AnyObserver

AnyObserver可以用来描叙任意一种观察者;

可以通过Observablebind(to: observer),当Observable发出元素的时候会执行AnyObserver的回调;

func anyObserver() {
    let observable = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
    let observer = AnyObserver<String> {[weak self] (value) in
        if case .next(let text) = value {
            self?.label.text = text
        }
    }
    observable.map({ "倒计时: \($0)" }).bind(to: observer).disposed(by: disposeBag)
}

02. Binder

Binder的特性

1. 不会处理错误事件,一旦产生错误事件,在调试环境下将执行fatalError,在发布环境下将打印错误信息;

2. 确保绑定都是在给定 Scheduler 上执行(默认 MainScheduler);

(1)直接创建,并绑定

func bindObserver() {
    let binder = Binder<String>(label) { (label, text) in
        label.text = text
    }
    let observable = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
    observable.map({ "倒计时: \($0)" }).bind(to: binder).disposed(by: disposeBag)
}


(2)创建一个Binder,将Observable绑定到binder,当发出错误事件的时候在调试环境下将执行fatalError,在发布环境下将打印错误信息;

func bindError() {
    let binder = Binder<String>(label) { (label, text) in
        label.text = text
    }
    let observable = Observable<Int>.create { (observer) -> Disposable in
        observer.onError(TestError.none)
        return Disposables.create()
    }
    observable.map({ "倒计时: \($0)" }).bind(to: binder).disposed(by: disposeBag)
}

运行结果:


Fatal error: Binding error: none: xxx


(3)给UI控件扩展自定义的Binder(实际开发中常用)

extension UILabel {
    var binderColor: Binder<UIColor> {
        Binder<UIColor>(self) { (label, textColor) in
            label.textColor = textColor
        }
    }
}

调用


observable.map({ $0 % 2 == 0 ? .blue : .red }).bind(to: label.binderColor).disposed(by: disposeBag)

(4)给Rective扩展自定义的Binder,作为通用的Binder(实际开发中常用)

extension Reactive where Base == UILabel {
    var binderFont: Binder<UIFont> {
        Binder<UIFont>(self.base) { (label, font) in
            label.font = font
        }
    }
}

调用


observable.map({ .systemFont(ofSize: $0 % 2 == 0 ? 15 : 20)
相关文章
|
1月前
LiveData和ViewModel源码学习
LiveData和ViewModel源码学习
|
存储 JavaScript 前端开发
RxJS系列02:可观察者 Observables
RxJS系列02:可观察者 Observables
|
存储 JSON fastjson
Intent传递数据全解
Intent传递数据全解
115 0
rxJava中 Subscriber 与Observer
rxJava中 Subscriber 与Observer
206 0
|
Android开发
Livedata用的爽吗,StateFlow你也应该了解一下
Livedata用的爽吗,StateFlow你也应该了解一下
715 0
Livedata用的爽吗,StateFlow你也应该了解一下
|
消息中间件 Android开发
【EventBus】发布-订阅模式 ( EventBus 组成模块 | 观察者模式 )
【EventBus】发布-订阅模式 ( EventBus 组成模块 | 观察者模式 )
335 0
【EventBus】发布-订阅模式 ( EventBus 组成模块 | 观察者模式 )
|
设计模式
ABAP实现设计模式里的观察者-发布者模式
This is an interview question from Wechat development team. The candidates are required to answer with JavaScript. Nevertheless I think it is also beneficial for an ABAPer if we master the design pattern contained in this question –Publish and Subscribe pattern.
ABAP实现设计模式里的观察者-发布者模式
|
存储 搜索推荐 开发工具
Rxjava源码解析笔记 | 创建Observable 与 Observer/Subscriber 以及之间订阅实现的源码分析
一篇关于Rxjava源码解析笔记,内容主要是 创建Observable 与 Observer/Subscriber 以及之间订阅实现的源码分析
|
C# 图形学
Unity 3D观察者设计模式-C#委托和事件的运用
C#观察者设计模式 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar —— 心分享、心...
1796 0