美文网首页
Observer - 观察者

Observer - 观察者

作者: Satelens | 来源:发表于2018-12-19 20:07 被阅读13次

响应事件的都是观察者

观察者是用来监听事件,然后它需要这个事件做出响应

如何创建观察者?

和 Observable 一样,框架已经帮我们创建好了许多常用的观察者。例如:view 是否隐藏,button 是否可点击, label 的当前文本,imageView 的当前图片等等。

另外,有一些自定义的观察者是需要我们自己创建的。这里介绍一下创建观察者最基本的方法,例如,我们创建一个弹出提示框的的观察者:

image.png
tap.subscribe(onNext: { [weak self] in
    self?.showAlert()
}, onError: { error in
    print("发生错误: \(error.localizedDescription)")
}, onCompleted: {
    print("任务完成")
})

创建观察者最直接的方法就是在 Observable 的 subscribe 方法后面描述,事件发生时,需要如何做出响应。而观察者就是由后面的 onNext,onError,onCompleted的这些闭包构建出来的。

AnyObserver

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

例如:

打印网络请求结果:

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)

可以看做:

let observer: AnyObserver<Data> = AnyObserver { (event) in
    switch event {
    case .next(let data):
        print("Data Task Success with count: \(data.count)")
    case .error(let error):
        print("Data Task Error: \(error)")
    default:
        break
    }
}

URLSession.shared.rx.data(request: URLRequest(url: url))
    .subscribe(observer)
    .disposed(by: disposeBag)

用户名提示语是否隐藏:

usernameValid
    .bind(to: usernameValidOutlet.rx.isHidden)
    .disposed(by: disposeBag)

可以看做是:

let observer: AnyObserver<Bool> = AnyObserver { [weak self] (event) in
    switch event {
    case .next(let isHidden):
        self?.usernameValidOutlet.isHidden = isHidden
    default:
        break
    }
}

usernameValid
    .bind(to: observer)
    .disposed(by: disposeBag)

Binder

Binder 主要有以下两个特征:

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

一旦产生错误事件,在调试环境下将执行 fatalError,在发布环境下将打印错误信息。

Binder 可以只处理 next 事件,并且保证响应 next 事件的代码一定会在给定 Scheduler 上执行,这里采用默认的 MainScheduler。

复用

由于页面是否隐藏是一个常用的观察者,所以应该让所有的 UIView 都提供这种观察者:

extension Reactive where Base: UIView {
  public var isHidden: Binder<Bool> {
      return Binder(self.base) { view, hidden in
          view.isHidden = hidden
      }
  }
}
usernameValid
    .bind(to: usernameValidOutlet.rx.isHidden)
    .disposed(by: disposeBag)

这样你不必为每个 UI 控件单独创建该观察者。这就是 usernameValidOutlet.rx.isHidden 的由来,许多 UI 观察者 都是这样创建的:

按钮是否可点击 button.rx.isEnabled:

extension Reactive where Base: UIControl {
  public var isEnabled: Binder<Bool> {
      return Binder(self.base) { control, value in
          control.isEnabled = value
      }
  }
}

label 的当前文本 label.rx.text:

extension Reactive where Base: UILabel {
  public var text: Binder<String?> {
      return Binder(self.base) { label, text in
          label.text = text
      }
  }
}

相关文章

  • Android 开发--观察者模式

    观察者 模式 有两个 角色,观察者observer ,被观察者observable。 Observer 是个接口,...

  • RxJava

    Observable & Observer 观察者(Observer)对可观察对象(Observable)发射的数...

  • RxJava源码解析

    基本框架 Observable (可观察者,即被观察者) Observer (观察者) subscribe (订阅...

  • RxJava Observable 使用和源码阅读

    ReactiveX 系列文章目录 Observable/Observer 的使用 过去的 Observer 观察者...

  • Swift - RxSwift的使用详解5(观察者1: AnyO

    一、观察者(Observer)介绍 观察者(Observer)的作用就是监听事件,然后对这个事件做出响应。或者说任...

  • Rxjava 2.0

    添加依赖 Observable(被观察者)/Observer(观察者) Flowable(被观察者)/Subscr...

  • 10. RxJava

    RxJava Observable: 被观察者Observer: 观察者subscribe: 订阅observe...

  • 30天学RxSwift——Observer

    Observer即观察者,在RxSwift中有许多名称的Observer,ObserveBase,Anonymou...

  • KVO实现

    观察对象添加观察者( observer ): observer中需要实现一下方法:

  • RxJava2.0初学知识回顾

    1、RxJava的重要组成 Observable (可观察者,即被观察者)、Observer (观察者)、subs...

网友评论

      本文标题:Observer - 观察者

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