mapanguan

导航

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]
       

  

posted on 2018-06-29 10:45  mapanguan  阅读(191)  评论(0编辑  收藏  举报