美文网首页
Swift - 响应式编程

Swift - 响应式编程

作者: aven_kang | 来源:发表于2022-05-23 13:08 被阅读0次
    截屏2022-03-11 下午6.42.53.png

    RxSwift - ReactiveX for Swift

    RxSwift的核心角色
    Observable:负责发送事件(Event)
    Observer:负责订阅Obserable,监听Observable发送的事件
    截屏2022-03-11 下午7.25.41.png

    示例 - 创建、订阅Observable

            let ob = Observable<Int>.create { ob in
    
                ob.onNext(11)
                ob.onCompleted()
                return Disposables.create()
    
            }
    这是创建了一个obserable
    
            ob.subscribe { event in
                switch event {
                case .next(let element):
                    print("next",element) // next 11
                case .completed:
                    print("completed") // completed
                case .error(let error):
                    print("error",error)
                }
            }
            
            ob.subscribe { element in
                print("next2",element) // next2 11
            } onError: { Error in
                print("error",Error)
            } onCompleted: {
                
            } onDisposed: {
                        
            }
    

    上一段代码是订阅了ob这个对象,ob这个对象发出了onNext(11)和onCompleted(),所以订阅者收到了发出的信号,打印出了next 11,completed
    再介绍几种创建observable的方法

            var ob1 = Observable.just(13)
            var ob2 = Observable.of(14)
            var ob3 = Observable.from(optional: 15)
    

    这几种都可以创建observable

    timer

            let ob4 = Observable<Int>.timer(.seconds(2), period: .seconds(1), scheduler: MainScheduler.instance)
            ob4.subscribe { Event in
                print(Event)
            }
    
    next(0)
    next(1)
    next(2)
    next(3)
    next(4)
    next(5)
    next(6)
    next(7)
    

    第一个参数的意思是,2秒之后执行,第二个参数是每秒执行一次,第三个参数是在主线程里操作

    示例

            let ob4 = Observable<Int>.timer(.seconds(2), period: .seconds(1), scheduler: MainScheduler.instance)
            ob4.subscribe { Event in
                print(Event)
            }
    
            var la = UILabel.init(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
            la.text = "test"
            la.textColor = UIColor.red
            self.view.addSubview(la)
            
            ob4.map { index in
                "\(index)"
            }.bind(to: la.rx.text)
    

    上述代码,演示了定时器刷新lable的的功能,因为obserable是Int类型,所以不能直接绑定到lable里面去,需要我们使用map转成String类型

    Disposable

    每当Obserable被订阅时,都会返回一个Disposable实例,当调用Disposable的dispose,就相当于取消订阅了
           let dispose =  ob1.subscribe { event in
                print(event) // next(13)
            }
            
            dispose.dispose()
    
    可以在需要的时候调用dispose(),这样就不会再收到信号了
           ob1.subscribe { event in
                print(event) // next(13)
            }.dispose()
    
    这种写法表示一旦收到订阅的消息,就只会执行一次,以后不会再接收订阅
            let bag = DisposeBag()
    
            ob1.subscribe { event in
                print(event) // next(13)
            }.disposed(by: bag)
            
            ob2.subscribe { event in
                print(event) // next(14)
            }.disposed(by: bag)
            
            ob3.subscribe { Event in
                print(Event) // next(15)
            }.disposed(by: bag)
    
    这种销毁机制,相当于把ob1,ob2,ob3,都放入了一个袋子,bag这个袋子,那这个袋子什么时候销毁,取决于控制器什么时候执行deinit,就会跟随着控制器一起取消了订阅
           ob3.takeUntil(self.rx.deallocated).subscribe { Event in
                print(Event)
            }
    

    takeUntil表示什么时候执行dispose()这个方法,self.rx.deallocated表示在控制器消亡的时候,就会取消订阅

    创建Obserable

            var label = UILabel.init(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
            label.text = "test"
            label.textColor = UIColor.red
            self.view.addSubview(label)
            
            let binder = Binder<String>(label) { label, value in
                label.text = value
            }
            
            Observable.just(1).map({ Index in
                "test:\(Index)"
            }).subscribe(binder).dispose()
    
            Observable.just(1).map({ Index in
                "test:\(Index)"
            }).subscribe(binder).dispose()
            
            Observable.just(1).map { index in
                "数值2:\(index)"
            }.bind(to: binder).dispose()
    
    这两种写法是一样的

    示例

    需求:放置一个按钮,按钮每个一秒消失,每隔一秒显示
            let obserable = Observable<Int>.timer(.seconds(2), period: .seconds(1),         scheduler: MainScheduler.instance)
            // 首先创建obserable,定时器
            
            var button = UIButton.init(frame: CGRect(x: 100, y: 200, width: 100, height: 100)) // 放置按钮
            button .setTitle("按钮", for: .normal)
            button.backgroundColor = .red
            self.view.addSubview(button)
            
            let buttonBinder = Binder<Bool>(button) {button,value in
                button.isHidden = value
            }
            // 定义observe,监听器,由于是需要显示与消失,我们定义bool类型,绑定的对象是button
            
            obserable.map { index in
                index % 2 == 0
            }.bind(to: buttonBinder).disposed(by: bag)
            // obserable发送的是Int类型,我们要转成bool类型,用index%2==0的返回值就是bool类型,来确定button的显示与消失,至于什么时候disposed,我们定义了一个bag,当控制器消失的时候,bag也会随之消失
    

    相关文章

      网友评论

          本文标题:Swift - 响应式编程

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