美文网首页
RXswift 创建观察者的几种方式

RXswift 创建观察者的几种方式

作者: _我和你一样 | 来源:发表于2019-07-31 09:58 被阅读0次

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

所谓观察者,就是对事件的处理者。有以下几种方式

  • 在 subscribe 方法中创建
  • 在 bind 方法中创建
  • 使用 AnyObserver 创建任意类型的观察者
  • 使用 Binder 创建特定场景的观察者
在 subscribe 方法中创建
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 创建任意类型的观察者
// 指定观察者使用的数据类型,并对发生的事件进行处理
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)

也可以使用 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 创建特定场景的观察者

相较于AnyObserver 的大而全,Binder 更专注于特定的场景。Binder 主要有以下特征:

  1. 不会处理错误事件,一旦产生错误,在 debug 模式下,执行 fatelError,在发布环境打印错误信息
  2. 确保绑定都是在给定线程上执行,默认是主线程
 //观察者
        let observer: Binder<String> = Binder(label) { (view, text) in
            //收到发出的索引数后显示到label上
            view.text = text
        }
         
        //Observable序列(每隔1秒钟发出一个索引数)
        let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
        observable
            .map { "当前索引数:\($0 )"}
            .bind(to: observer)
            .disposed(by: disposeBag)
    }

创建自定义可绑定属性

  • 通过对 NSView 类进行扩展
  • 通过对 Reactive 类进行扩展

比如给 NSTextFiled 增加 fontSize 属性

extension NSTextField {
    public var fontSize:Binder<CGFloat>{
        return Binder(self, binding: { (label, fontSize) in
            label.font = NSFont.systemFont(ofSize: fontSize)
        })
    }
}

可以这么使用:

        //Observable序列(每隔0.5秒钟发出一个索引数)
        let observable = Observable<Int>.interval(0.5, scheduler: MainScheduler.instance)
        observable
            .map { CGFloat($0) }
            .bind(to: label.fontSize) //根据索引数不断变放大字体
            .disposed(by: disposeBag)
    }

通过对Reactive 类进行扩展,这么写更加规范,使用时,需要使用.rx.自定义属性

extension Reactive where Base: NSTextField {
    public var fontSize: Binder<CGFloat> {
        return Binder(self.base) { label, fontSize in
            label.font = NSFont.systemFont(ofSize: fontSize)
        }
    }
}

可以这么使用

     let observable = Observable<Int>.interval(0.5, scheduler: MainScheduler.instance)
        observable
            .map { CGFloat($0) }
            .bind(to: label.rx.fontSize) //根据索引数不断变放大字体
            .disposed(by: disposeBag)
    }

RxSwift 也有很多自带的可绑定属性,比如对 NSTextFiled 就有 text

相关文章

网友评论

      本文标题:RXswift 创建观察者的几种方式

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