美文网首页Swift学习笔记
RXSwift-Observable的创建(二)

RXSwift-Observable的创建(二)

作者: Ldies | 来源:发表于2019-07-31 19:31 被阅读0次

通过上一篇探索RXSwift核心逻辑(一)的介绍,相信小伙伴们对于,RxSwift这个函数响应式编程框架有了一个较为深刻的认识,今天我们来介绍下RxSwift中各种Observable 可观察序列的创建,希望能够带给各位小伙伴一些帮助。

Observable创建

empty

let emtyOb = Observable<Int>.empty()
        _ = emtyOb.subscribe(onNext: { (number) in
            print("订阅:",number)
        }, onError: { (error) in
            print("error:",error)
        }, onCompleted: {
            print("完成回调")
        }) {
            print("释放回调")
        }
//打印 完成回调 释放回调
  • 首先来一个空的序列 - 本来序列事件是Int类型的,这里调用emty函数 没有序列,只能complete

just

let array = ["AAA","BBB"]
        Observable<[String]>.just(array)
            .subscribe { (event) in
                print(event)
            }.disposed(by: disposeBag)
        
        _ = Observable<[String]>.just(array).subscribe(onNext: { (number) in
            print("订阅:",number)
        }, onError: { (error) in
            print("error:",error)
        }, onCompleted: {
            print("完成回调")
        }) {
            print("释放回调")
        }
//打印
//next(["AAA", "BBB"])
//completed
//订阅: ["AAA", "BBB"]
//完成回调
//释放回调
  • just单个信号序列创建,订阅一次数据后立刻自动调用completed,销毁内存
  Observable<String>.of("AAA","BBB")
            .subscribe { (event) in
                print(event)
            }.disposed(by: disposeBag)
        
        let ob = Observable<String>.of("AAA","BBB")
        _ = ob.subscribe(onNext: { (element) in
            print(element)
        },  onCompleted: {
            print("完成回调")
        }, onDisposed: {
            print("释放回调")
        })
********of********
//next(AAA)
//next(BBB)
//completed
//订阅(AAA)
//订阅(BBB)
//完成回调
//释放回调
  • of针对多个元素的序列处理
Observable<[String]>.from(optional: ["AAA","BBB"])
            .subscribe { (event) in
                print(event)
            }.disposed(by: disposeBag)

*from从集合中获取序列: 数组,集合,set 获取序列 - 有可选项处理 - 更安全

        var isOdd = true
        _ = Observable<Int>.deferred { () -> Observable<Int> in
            // 这里设计我们的序列
            isOdd = !isOdd
            if isOdd {
                return Observable.of(1,3,5,7,9)
            }
            return Observable.of(0,2,4,6,8)
            }
            .subscribe { (event) in
                print(event)
            }
//next(0)
//next(2)
//next(4)
//next(6)
//next(8)
//completed

  • 使用deferred()方法延迟Observable序列的初始化,通过传入的block来实现Observable序列的初始化并且返回。
Observable.range(start: 2, count: 5)
            .subscribe { (event) in
                print(event)
            }.disposed(by: disposeBag)
//打印
//next(2)
//next(3)
//next(4)
//next(5)
//next(6)
//completed
  • range生成指定范围内的可观察整数序列
        Observable.generate(initialState: 0,// 初始值
                            condition: { $0 < 10}, // 条件1
                            iterate: { $0 + 2 })  // 条件2 +2
            .subscribe { (event) in
                print(event)
            }.disposed(by: disposeBag)
//打印
//next(0)
//next(2)
//next(4)
//next(6)
//next(8)
//completed
 let arr = ["AAA_1","AAA_2","AAA_3","AAA_4","AAA_5","AAA_6","AAA_7","AAA_8","AAA_9","AAA_10"]
        Observable.generate(initialState: 0,// 初始值
            condition: { $0 < arr.count}, // 条件1
            iterate: { $0 + 1 })  // 条件2 +2
            .subscribe(onNext: {
                print("遍历arr:",arr[$0])
            })
            .disposed(by: disposeBag)
  • generate该方法创建一个只有当提供的所有的判断条件都为 true 的时候,才会给出动作的 Observable 序列。初始值给定 然后判断条件1 再判断条件2 会一直递归下去,直到条件1或者条件2不满足,类似for循环遍历数组
        // 第一次参数:第一次响应距离现在的时间 也就是延迟几秒处罚
        // 第二个参数:时间间隔
        // 第三个参数:线程
        let timer = Observable<Int>.timer(1, period: 1, scheduler: MainScheduler.instance)
            .takeUntil(.exclusive, predicate: { (num) -> Bool in
            if (num == self.countDownSeconds+1) {
                return true
            }else{
                return false
            }
        })
            .map{self.countDownSeconds - $0}
            .filter { $0 >= 0 }
            .asObservable()
        
        let second = btn.rx.tap.flatMapLatest { _ -> Observable<Int> in

            return timer
        }
        
        second.map { $0 == 0 ? "发送验证码":"再次发送(\($0)s)"}.bind(to: self.btn.rx.title()).disposed(by: disposeBag)

        second.map{ $0 == 0 ? true : false }.bind(to: self.btn.rx.isEnabled).disposed(by: disposeBag)
        
        timer.subscribe { (event) in
            print(event)
        }.disposed(by: disposeBag)
next(10)
next(9)
next(8)
next(7)
next(6)
next(5)
next(4)
next(3)
next(2)
next(1)
next(0)
completed
  • 上图为利用timer实现的登录按钮发送验证码功能,利用takeUntil ()函数为闭包返回true时发送完成

以上为RxSwift-Observable创建中的一些api的介绍,未完待续。

相关文章

  • RXSwift-Observable的创建(二)

    通过上一篇探索RXSwift核心逻辑(一)的介绍,相信小伙伴们对于,RxSwift这个函数响应式编程框架有了一个较...

  • RxSwift-初探

    RxSwift-初探RxSwift核心逻辑-源码分析RxSwift-Observable序列的创建方式RxSwif...

  • RxSwift-observable创建

    emty 创建一个空的序列,但是只能订阅到complete just 构建一个只有一个元素的observable序...

  • RxSwift-Observable序列的创建方式

    序列在RxSwift的世界里面是非常重要,平时开发过程用好序列的创建,能够给开发带来事半功倍的效果!这个篇章总结了...

  • RxSwift-Observable初识

    Observable三步曲 使用 源码解析 创建序列 Observable的create创建了AnonymousO...

  • RxSwift-Observable asDriver后的事件订

    实验 创建一个Observable信号,发送next和error信号 转换成Driver并订阅 发送next和co...

  • 周的创建二

    克商不久武王离世,继位的武王的长子成王尚年幼。克商的扫尾工作和新政的创建工作是由文王另一个儿子武王的弟弟周公领导的...

  • 二、线程的创建

    一、创建方式 线程的创建有三种方式: 继承Thread类 实现Runnable接口 实现Callable接口 注:...

  • iOS 框架的创建

    iOS框架的创建(一) —— 一个详细的框架创建流程(一)iOS框架的创建(二) —— 一个详细的框架创建流程(二)

  • JavaScript常用对象和方法

    String 一、创建方式 二、属性和方法 Array 一、创建方式 二、属性 三、常用方法 Date 对象的创建...

网友评论

    本文标题:RXSwift-Observable的创建(二)

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