美文网首页
RxSwift Observer-观察者

RxSwift Observer-观察者

作者: darrenW | 来源:发表于2018-09-21 23:16 被阅读48次

我们在之前已经了解了什么是Observer观察者,这篇我们了解一下怎么创建观察者以及特征观察者。

1.在 subscribe 方法中创建

创建观察者最直接的方法就是在Observablesubscribe方法后面描述当事件发生时,需要如何做出响应。举个🌰:

let observable = Observable.of(1,2,3,4,5)
observable.subscribe(onNext: { element in
    print(element)
}, onError: { error in
    print(error)
}, onCompleted: {
    print("completed")
})

运行结果如下:


运行结果.png

2.在bind方法中创建

我们创建一个定时生成索引数的Observable序列,并将索引数不断显示在label标签上
举个🌰:

import UIKit
import RxCocoa
import RxSwift

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    let disposeBag = DisposeBag()
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
        observable.map{ "当前索引数:\($0)" }
            .bind { [weak self](text) in
                self?.label.text = text
        }.disposed(by: disposeBag)
    }
   
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

运行结果:

bind结果.png
除了以上创建方法外,我们还可以使用其他的方式,比如AnyObserverBinder

3.使用AnyObserver创建观察者

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

3.1配合subscribe方法使用
let observer: AnyObserver<Int> = AnyObserver { event in
    switch event{
    case .next(let data):
        print(data)
    case .error(let error):
        print(error)
    case .completed:
        print("completed")
    }
}
let observable = Observable.of(1,2,3,4,5)
observable.subscribe(observer)

运行结果如下:


运行结果.png
3.2配合bindTo方法使用
import UIKit
import RxCocoa
import RxSwift

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    let disposeBag = DisposeBag()
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let observer: AnyObserver<String> = AnyObserver{
            [weak self] event in
            switch event{
            case .next(let text):
                self?.label.text = text
            default:
                break
            }
        }
        let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
        observable.map{"当前索引数:\($0)"}
                .bind(to: observer)
                .disposed(by: disposeBag )
    }
   
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

4. Binder

Binder 主要有以下两个特征:

  • 不会处理错误事件
  • 确保绑定都是在给定Schedule上执行(默认MainScheduler

一旦产生错误事件,在调试环境下将执行fatalError,在发布环境下将打印错误信息
在上面更新label文字的例子中,更好的方式就是使用Binder。理由有二:

  • UI的更新在主线程完成
  • 只处理next事件
import UIKit
import RxCocoa
import RxSwift

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    let disposeBag = DisposeBag()
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let observer: Binder<String> = Binder(label){
            (view,text) in
            view.text = text
        }
        let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
        observable.map{ "当前索引数:\($0)"}
                .bind(to: observer)
                .disposed(by: disposeBag)
    }
   
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

下面,我们再去实现另外一段代码:

let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
observable.map{ $0 % 2 == 0}
        .bind(to: label.rx.isHidden)
        .disposed(by: disposeBag)

此时label会不断的消失、出现。这段代码里我们又操作了什么?查看label.rx.isHiddenisHidden可以发现

extension Reactive where Base: UIView {
    public var isHidden: Binder<Bool> {
        return Binder(self.base) { view, hidden in
            view.isHidden = hidden
        }
    }
}

其实RxCocoa在对许多 UI 控件进行扩展时,就利用Binder将控件属性变成观查者,我们也可以用这种方式来创建自定义的 UI 观察者。

相关文章

  • RxSwift Observer-观察者

    我们在之前已经了解了什么是Observer观察者,这篇我们了解一下怎么创建观察者以及特征观察者。 1.在 subs...

  • observer-观察者模式

    解决问题 观察者模式又称之为发布-订阅模式,它的一个关键作用是使角色之间解耦合。 应用场景 常见的应用场景是分布式...

  • RxSwift 个人学习笔记记录

    文章目录 一 什么是RxSwift 二 RxSwift做了什么2-1简单介绍观察者设计模式2-1RxSwift做了...

  • RxSwift源码分析(一)序列核心逻辑

    RxSwift核心概念就是观察者(observer)订阅一个可观察者序列(Observable),观察者对数据序列...

  • RxSwift(V) - 源码解析

    RxSwift 角色定位 观察者(Observer) 被观察者(可观察的)(Observable) 订阅者(Sub...

  • RxSwift 核心原理解析

    RxSwift 核心原理解析 角色定位 观察者(Observer) 被观察者(Observable) 订阅者(Su...

  • RXSwift笔记

    观察者模式:KVO、通知 被观察者:发出一个事件 观察者/订阅者:对被观察者对象进行响应 RXSwift:把程序中...

  • 2018-01-30设计模式-观察者模式

    Observer-提供了一种对象设计,让主题和观察者之间松耦合的对象行为模式。 在对象之间定义一对多的依赖,这样一...

  • RXswift 创建观察者的几种方式

    RXswift 创建观察者的几种方式: 所谓观察者,就是对事件的处理者。有以下几种方式 在 subscribe 方...

  • RxSwift-dispose源码解析

    RxSwift是由序列,观察者,调度者,销毁者组成。可见,销毁者在RxSwift的重要性。了解销毁者,才能更好的了...

网友评论

      本文标题:RxSwift Observer-观察者

      本文链接:https://www.haomeiwen.com/subject/zomanftx.html