美文网首页
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写一个响应式编程库

    用Swift写一个响应式编程库 用Swift写一个响应式编程库

  • RxSwift核心逻辑

    github地址 中文文档 前言 RxSwift是Swift的一套响应式编程框架,如同OC的RAC。响应式编程的核...

  • RxSwift 核心逻辑初探

    RxSwift RxSwift: Reactive Extensions Swift,函数响应式编程的基础框架。简...

  • Swift 响应式编程

    译者:李鑫原文:REACTIVE PROGRAMMING IN SWIFT本文为极客学院Wiki组织翻译,转载请注...

  • Swift - 响应式编程

    RxSwift - ReactiveX for Swift RxSwift的核心角色 Observable:负责发...

  • Swift -- 响应式编程

    响应式编程(Reactive Programming,简称RP) 也是一种编程范式,于1997年提出,可以简化异步...

  • RxSwift初探(1)

    一、前提:函数响应式编程思想 简单来说 函数响应式编程 = 函数式编程 + 响应式编程 (1)函数式 函数式编程是...

  • RxSwift学习资料

    Swift的响应式编程需要用到RxSwift和RxCocoa: RxSwift:它只是基于 Swift 语言的 R...

  • Swift5.0 - day13 - 响应式编程

    一、响应式编程 1.1、响应式编程(Reactive Programming,简称RP)响应式编程是一种编程范式,...

  • RxJava

    响应式编程概述 什么是响应式编程? 是一种基于异步数据流概述的编程模式 响应式编程--关键概念 事件 响应式编程-...

网友评论

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

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