RxSwift学习笔记4:disposeBag/scheduler/AnyObserver/Binder
let disposeBg = DisposeBag() //直接在创建 //在 subscribe 方法中创建 let ofObserval = Observable.of("a","b","c") ofObserval.subscribe(onNext: { (element) in print(element) }, onError: { (error) in print(error.localizedDescription) }, onCompleted: { print("完成") }) { print("取消") }.disposed(by: disposeBg) let schedulerObserval = Observable<Int>.interval(1, scheduler: MainScheduler.instance) //在 bind 方法中创建 schedulerObserval .map { "当前索引:\($0)" //返回字符串 } .bind {(value) in //action print(value) } .disposed(by: disposeBg) //写在appdelegate里不执行,写在VC里正常??? //AnyObserver 可以用来描叙任意一种观察者。 //配合 subscribe 方法使用 let anyObserval:AnyObserver<String> = AnyObserver{ event in switch event{ case .next(let data): //action print(data) case .error(let error): print(error) case .completed: print("完成") } } // let anyOB = ofObserval.subscribe(anyObserval) // print(anyOB) //配合 bindTo 方法使用 schedulerObserval .map{"点前索引\($0)"} .bind(to: anyObserval) .disposed(by:disposeBg) /*===> 写在appdelegate里不执行,写在VC里正常??? 当前索引:0 当前索引:1 当前索引:2 当前索引:3 当前索引:4 当前索引:5 当前索引:6 当前索引:7 当前索引:8 当前索引:9 当前索引:10 */
@IBOutlet weak var label: UILabel! @IBOutlet weak var mbutton: UIButton! let disposeBag = DisposeBag() //上面序列数显示样例中,label 标签的文字显示就是一个典型的 UI 观察者。 //它在响应事件时,只会处理 next 事件,而且更新 UI 的操作需要在主线程上执行。 //那么这种情况下更好的方案就是使用 Binder。 let blinderObserval:Binder<String> = Binder(label){view,text in view.text = text } //Observable序列(每隔1秒钟发出一个索引数) let scheduleObservable = Observable<Int>.interval(1, scheduler: MainScheduler.instance) scheduleObservable .map{"当前索引\($0)"} .bind(to: blinderObserval) .disposed(by: disposeBag) scheduleObservable .map {$0 % 2 == 0} .bind(to: mbutton.rx.isEnabled) .disposed(by: disposeBag) //Binder 在 RxCocoa 中的应用 let schedulerObserval = Observable<Int>.interval(1, scheduler: MainScheduler.instance) //在 bind 方法中创建 schedulerObserval .map { "当前索引:\($0)" //返回字符串 } .bind {(value) in //action print(value) } .disposed(by: disposeBag)
补充知识:
//Swift==>map let array = [1,2,3,4,5] let mapArray = array.map { (value) -> Int in return value + 2 } print(mapArray) //===>[3, 4, 5, 6, 7] let mapArray1 = array.map{ return $0*2 } print(mapArray1) //===>[2, 4, 6, 8, 10] func arrayCount(int:Int) -> Int{ return int*3 } let mapArray0 = array.map(arrayCount) print(mapArray0) //===>[3, 6, 9, 12, 15] /* 2 flatMap与map不同之处: (1)flatMap返回后的数组中不存在nil,同时它会把Optional解包 (2)flatMap还能把数组中存有数组的数组(二维数组、N维数组)一同打开变成一个新的数组 */ //Swift==>flatMap let mapArr = array.map { (int) -> String? in let ms = "\(int)" return ms } print(mapArr) //===>[Optional("1"), Optional("2"), Optional("3"), Optional("4"), Optional("5")] //flatMap' is deprecated: Please use compactMap(_:) //for the case where closure returns an optional value Use 'compactMap(_:)' instead let mapArr1 = array.compactMap { (int) -> String? in let ms = "\(int)" return ms } print(mapArr1) //===>["1", "2", "3", "4", "5"] let testArray = [[1,2,3],[4,5,6],[7,8,9]] let mapArray3 = testArray.map{$0} print(mapArray3) //===>[[1, 2, 3], [4, 5, 6], [7, 8, 9]] let mapArray4 = testArray.flatMap{$0} print(mapArray4) //===>[1, 2, 3, 4, 5, 6, 7, 8, 9]