美文网首页
观察者: AnyObserver、Binder

观察者: AnyObserver、Binder

作者: FallPine | 来源:发表于2018-09-03 18:03 被阅读9次

    观察者(Observer)的作用就是监听事件,然后对这个事件做出响应。或者说任何响应事件的行为都是观察者。比如:

    • 当我们点击按钮,弹出一个提示框。那么这个“弹出一个提示框”就是观察者 Observer<Void>
    • 当我们请求一个远程的 json 数据后,将其打印出来。那么这个“打印 json 数据”就是观察者 Observer<JSON>
    • subscribe订阅观察者序列时,block就是对应的观察者
    let observable = Observable.of("A", "B", "C")
              
    observable.subscribe(onNext: { element in
        print(element)
    }, onError: { error in
        print(error)
    }, onCompleted: {
        print("completed")
    })
    
    • bind 方法创建观察者
    //Observable序列(每隔1秒钟发出一个索引数)
    let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
     
    observable
        .map { "当前索引数:\($0 )"}
        .bind { [weak self](text) in
             //收到发出的索引数后显示到label上
            self?.label.text = text
        }
        .disposed(by: disposeBag)
    
    • AnyObserver 创建观察者

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

    //观察者
    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).disposed(by: disposeBag)
    
    • bindTo 方法创建观察者
    //观察者
    let observer: AnyObserver<String> = AnyObserver { [weak self] (event) in
        switch event {
        case .next(let text):
            //收到发出的索引数后显示到label上
            self?.label.text = text
        default:
            break
        }
    }
             
    //Observable序列(每隔1秒钟发出一个索引数)
    let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
    observable
        .map { "当前索引数:\($0 )"}
        .bind(to: observer)
        .disposed(by: disposeBag)
    
    • Binder 创建观察者:不会处理错误事件,并且确保绑定都是在给定 Scheduler 上执行(默认 MainScheduler),一旦产生错误事件,在调试环境下将执行 fatalError,在发布环境下将打印错误信息
    @IBOutlet weak var label: UILabel!
         
    let disposeBag = DisposeBag()
         
    override func viewDidLoad() {
                     
        //观察者
        let observer: Binder<String> = Binder(label) { (lab, text) in
            //收到发出的索引数后显示到label上
            lab.text = text
        }
             
        //Observable序列(每隔1秒钟发出一个索引数)
        let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
        observable
            .map { "当前索引数:\($0 )"}
            .bind(to: observer)
            .disposed(by: disposeBag)
    }
    

    参考文章:Swift - RxSwift的使用详解5(观察者1: AnyObserver、Binder)

    相关文章

      网友评论

          本文标题:观察者: AnyObserver、Binder

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