RxSwift之AnyObserver、Binder

Observer

观察者Observer的作用就是监听事件,然后对这个事件作出响应。任何响应事件的行为都是观察者。

比如,点击按钮后弹出一个提示框,那么“弹出一个提示框”就是观察者。

创建观察者
  • subscribe方法中创建

    1
    2
    3
    4
    5
    6
    7
    8
    let observable = Observable.of("A","B","C")
    observable.subscribe( onNext: { element in
    print(element)
    }, onError: { error in
    print(error)
    }, onCompleted: {
    print("completed")
    })
  • bind方法中创建

    1
    2
    3
    4
    5
    6
    7
    8
    let disposeBag = DisposeBag()
    let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
    observable
    .map { "当前索引数:\($0)"}
    .bind { [weak self](text) in
    self?.label.text = text
    }
    .disposed(by:disposeBag)
  • 使用AnyObserver创建,配合subscribe或者bindTo

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // 配合subscribe
    let observer:AnyObserver<String> = 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("A","B","C")
    observable.subscribe(observer)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // 配合bindTo
    let disposeBag = DisposeBag()
    let observer:AnyObserver<String> = AnyObserver { [weak self] event in
    switch event {
    case .next(let text):
    self?.label.text = text
    default: break
    }
    }
    let observable = Observer<Int>.interval(1, scheduler:MainScheduler.instance)
    observable
    .map { "当前索引数:\($0)"}
    .bind(to:observer)
    .disposed(by: disposeBag)
  • 使用Binder

    使用Binder创建观察者,相较于AnyObserver的大而全,Binder更专注于特定的场景。它不处理错误事件,并确保绑定都是在给定Scheduler上执行(默认MainScheduler)。一旦产生错误事件,在调试环境下将执行fatalError,在发布环境下将打印错误信息。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    let disposeBag = DisposeBag()
    let observer:Binder<String> = Binder(label) { view,text in
    // 将收到的索引数显示到label上
    view.text = text
    }
    let observable = Observable<Int>.interval(1, scheduler:MainScheduler.instance)
    observable
    .map{ "当前索引数:\($0)"}
    .bind(to:observer)
    .disposed(by:disposeBag)