zoukankan      html  css  js  c++  java
  • 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]
           
    

      

  • 相关阅读:
    作业6 团队项目之需求(改)
    作业6第一天进度
    作业6第二天进度
    作业6四则运算APP之Sprint计划
    作业6第3、4、5天进度
    重新梳理Python基础(7)
    BAE博客开发之基础知识积累Django篇(1)
    重新梳理Python基础(11)
    重新梳理Python基础(6)
    重新梳理Python基础(9)
  • 原文地址:https://www.cnblogs.com/mapanguan/p/9242270.html
Copyright © 2011-2022 走看看