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)
相关文章
|
API Swift iOS开发
开门小例子学习观察者模式&事件与委托
3.2.一个喊话人(喊话人有权限),多个拿钥匙开门的人(每个人负责不同的门):米老师大喊给我开一下水麒麟的门——>此时听到消息并且拿着水麒麟钥匙的人就会过来开门
|
设计模式 Java
Java设计模式-观察者模式(Observer)
Java设计模式-观察者模式(Observer)
|
开发者
观察者(observer)
观察者(observer)
142 0
观察者(observer)
|
传感器 Java Android开发
简单明了,彻底地理解Binder
简单明了,彻底地理解Binder
简单明了,彻底地理解Binder
|
设计模式 Java 测试技术
浅析Java设计模式【3.3】——观察者
Java常用设计模式,观察者模式
97 0
浅析Java设计模式【3.3】——观察者
ViewModel源码研究之聊聊onSaveInstanceState和onRetainNonConfigurationInstance的区别
ViewModel源码研究之聊聊onSaveInstanceState和onRetainNonConfigurationInstance的区别
ViewModel源码研究之聊聊onSaveInstanceState和onRetainNonConfigurationInstance的区别
|
存储 设计模式 Java
浅谈JAVA设计模式之——观察者模式(Observer)
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
187 0
浅谈JAVA设计模式之——观察者模式(Observer)
|
存储 搜索推荐 开发工具
Rxjava源码解析笔记 | 创建Observable 与 Observer/Subscriber 以及之间订阅实现的源码分析
一篇关于Rxjava源码解析笔记,内容主要是 创建Observable 与 Observer/Subscriber 以及之间订阅实现的源码分析
|
Perl 测试技术 Android开发
RxSwift、RxBlocking、RxTest初尝试
在Android开发上,RxJava已经是非常重要的组成之一。最近在用Swift开发iOS应用,考虑在架构设计上使用RxSwift。 添加依赖 # Podfile use_frameworks! target 'YOUR_TARGET_NAME' do pod 'RxSwift', '~...
1772 0