美文网首页
RxSwift中Observable的各种创建方法

RxSwift中Observable的各种创建方法

作者: 简_爱SimpleLove | 来源:发表于2019-08-01 02:09 被阅读0次

Observable的创建方法有很多,下面我一一举例列举出来:

empty

empty()方法主要是创建了一个空的数据流,即空序列,里面没有任何的元素,所以它不会发出任何的next事件,也不会发出错误事件,它只会发出一个completed事件,然后终结。
没有被订阅的Observable实例并不会发出任何事件,也不会终结,数据也并没有被处理。直到订阅者出现,数据流就会开始向订阅者发送事件了。

        let emtyOb = Observable<Int>.empty()
        _ = emtyOb.subscribe(onNext: { (number) in
            print("订阅:",number)
        }, onError: { (error) in
            print("error:",error)
        }, onCompleted: {
            print("完成回调")
        }) {
            print("释放回调")
        }
        /*
          输出:
         完成回调
         释放回调
         */

just

顾名思义,返回只有一个元素的可观察序列。所以订阅传过来的参数也就只有一个:

        // 单个信号序列创建
        let array = ["LG_Cooci","LG_Kody"]
        Observable<[String]>.just(array)
            .subscribe { (event) in
                print(event)
            }.disposed(by: disposeBag)
        
        print("---------------------")

        _ = Observable<[String]>.just(array).subscribe(onNext: { (number) in
            print("订阅:",number)
        }, onError: { (error) in
            print("error:",error)
        }, onCompleted: {
            print("完成回调")
        }) {
            print("释放回调")
        }
        
        /*
         输出:
         next(["LG_Cooci", "LG_Kody"])
         completed
         ---------------------
         订阅: ["LG_Cooci", "LG_Kody"]
         完成回调
         释放回调
         */

以上是两种不同的订阅方法,第一种方法返回的是:包裹着参数的event事件。第二种方法分了3种情况处理,onNext中返回的是参数本身。

of

该方法接收可变的参数,但是参数的类型必须相同 。
如果没显示地说明类型,swift也会自动推断类型。
接收的事件,也是分开的依次接收。

        // 多个元素 - 针对序列处理
        Observable<String>.of("LG_Cooci","LG_Kody")
            .subscribe { (event) in
                print(event)
            }.disposed(by: disposeBag)
        
        print("---------------------")

        // 字典
        Observable<[String: Any]>.of(["name":"LG_Cooci","age":18])
            .subscribe { (event) in
                print(event)
            }.disposed(by: disposeBag)
        
        print("---------------------")

        
        // 数组
        Observable<[String]>.of(["LG_Cooci","LG_Kody"], ["one","two"])
            .subscribe { (event) in
                print(event)
            }.disposed(by: disposeBag)
        
        /*
         输出:
         next(LG_Cooci)
         next(LG_Kody)
         completed
         ---------------------
         next(["age": 18, "name": "LG_Cooci"])
         completed
         ---------------------
         next(["LG_Cooci", "LG_Kody"])
         next(["one", "two"])
         completed
         */

from

optional时,是包含一个可选参数的作为元素的序列,只能有一个参数。
没有optional时,是包含一个可列举的序列作为元素的序列。

        Observable<[String]>.from(optional: ["LG_Cooci","LG_Kody"]) // 可选数组
            .subscribe { (event) in
                print(event)
            }.disposed(by: disposeBag)
        print("---------------------")
        Observable.from(optional: ["name":"LG_Cooci","age":18])  // 可选字典
            .subscribe { (event) in
                print(event)
            }.disposed(by: disposeBag)
        print("---------------------")
        Observable.from(optional: "one")  // 可选字符串
            .subscribe { (event) in
                print(event)
            }.disposed(by: disposeBag)
        print("---------------------")
        Observable.from("one")            // 可列举的序列
            .subscribe { (event) in
                print(event)
            }.disposed(by: disposeBag)
        
        /*
         输出:
         next(["LG_Cooci", "LG_Kody"])
         completed
         ---------------------
         next(["name": "LG_Cooci", "age": 18])
         completed
         ---------------------
         next(one)
         completed
         ---------------------
         next(o)
         next(n)
         next(e)
         completed
         */

defer

一个可观察序列:有由外部控制的,生成序列工厂的方法。并且可以延迟该可观察序列的创建。

        // 这里有一个需求:动态序列 - 根据外界的标识 - 动态输出
        // 使用deferred()方法延迟Observable序列的初始化,通过传入的block来实现Observable序列的初始化并且返回。
        var isOdd = true  // 外界控制变量
        let factory = 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)
            }

        //第一次订阅测试
        _ = factory.subscribe { (event) in
            print("\(isOdd)", event)
        }
        print("---------------------")
        //第二次订阅测试
        _ = factory.subscribe { (event) in
            print("\(isOdd)", event)
        }
        /*
         输出:
         false next(0)
         false next(2)
         false next(4)
         false next(6)
         false next(8)
         false completed
         ---------------------
         true next(1)
         true next(3)
         true next(5)
         true next(7)
         true next(9)
         true completed
         */

rang

指定范围内的连续完整的可观察整数序列

        // 生成指定范围内的可观察整数序列。
        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
        */

generate

状态驱动循环产生元素的序列,类似于for循环

        // 该方法创建一个只有当提供的所有的判断条件都为 true 的时候,才会给出动作的 Observable 序列。
        // 初始值给定 然后判断条件1 再判断条件2 会一直递归下去,直到条件1或者条件2不满足
        // 类似 数组遍历循环
        Observable.generate(initialState: 0,// 初始值
                            condition: { $0 < 10}, // 条件1
                            iterate: { $0 + 2 })  // 条件2 +2
            .subscribe { (event) in
                print(event)
            }.disposed(by: disposeBag)
        print("---------------------")
        // 数组遍历
        let arr = ["LG_Cooci_1","LG_Cooci_2","LG_Cooci_3"]
        Observable.generate(initialState: 0,// 初始值
            condition: { $0 < arr.count}, // 条件1
            iterate: { $0 + 1 })  // 条件2 +2
            .subscribe(onNext: {
                print("遍历arr:",arr[$0])
            })
            .disposed(by: disposeBag)
        /*
         输出:
         next(0)
         next(2)
         next(4)
         next(6)
         next(8)
         completed
         ---------------------
         遍历arr: LG_Cooci_1
         遍历arr: LG_Cooci_2
         遍历arr: LG_Cooci_3
         */

timer

定时器的序列

        // 第一次参数:第一次响应距离现在的时间
        // 第二个参数:时间间隔
        // 第三个参数:线程
        Observable<Int>.timer(5, period: 2, scheduler: MainScheduler.instance)
            .subscribe { (event) in
                print(event)
            }
            .disposed(by: disposeBag)
        print("---------------------")
        // 因为没有指定期限period, 即period为nil, 故认定为一次性
        Observable<Int>.timer(1, scheduler: MainScheduler.instance)
            .subscribe { (event) in
                print("无period: \(event)")
            }
            .disposed(by: disposeBag)
        print("---------------------")

        /*
         输出:
         ---------------------
         ---------------------
         无period: next(0)
         无period: completed
         next(0)
         next(1)
         next(2)
         next(3)
         */

interval

还是一个定时器序列

        // 定时器
        // 第一个参数:时间间隔
        // 第二个参数:线程
        Observable<Int>.interval(1, scheduler: MainScheduler.instance)
            .subscribe { (event) in
                print(event)
            }
            .disposed(by: disposeBag)

repeatElement

可以无限发出给定元素的observable序列,当和别的序列在一个线程的时候,会阻塞线程,导致别的序列不能响应订阅。
比如当和上面的定时器都在主线程的时候,定时器将不会响应

//         该方法创建一个可以无限发出给定元素的 Event的 Observable 序列(永不终止)
        Observable<Int>.repeatElement(5)
            .subscribe { (event) in
                 print("订阅:",event)
            }
            .disposed(by: disposeBag)

error

创建一个不会做任何操作,而是直接发送一个错误的observable序列

        Observable<String>.error(NSError.init(domain: "lgerror", code: 10086, userInfo: ["reason":"unknow"]))
            .subscribe { (event) in
                print("订阅:",event)
            }
            .disposed(by: disposeBag)
        
        print("---------------------")

        enum MyError: Error {
            case A
            case B
        }
        _ = Observable<Int>.error(MyError.A)
            .subscribe { (event) in
                print("订阅:",event)
            }
            .disposed(by: disposeBag)
        /*
         输出:
         订阅: error(Error Domain=lgerror Code=10086 "(null)" UserInfo={reason=unknow})
         ---------------------
         订阅: error(A)
         */

never

创建一个永远不会停止发出Event的observable序列

        print("********never********")
        //MARK:  never
        // 该方法创建一个永远不会发出 Event(也不会终止)的 Observable 序列。
        // 这种类型的响应源 在测试或者在组合操作符中禁用确切的源非常有用
        Observable<String>.never()
            .subscribe { (event) in
                print("走你",event)
            }
            .disposed(by: disposeBag)
        print("********never********")
        
        /*
         ********never********
         ********never********
         */

create

接收一个block形式的参数,对每一个过来的订阅者进行处理的序列

        let observable12 = Observable<String>.create { (observer) -> Disposable in
            //对订阅者发出next事件,且携带一个数据hello world
            observer.onNext("hello world")
            observer.onNext("hello swift")
            //对订阅者发出.complated事件
            observer.onCompleted()
            //一个订阅者会有一个Disposable类型的返回值,所以结尾要return一个Disposable
            return Disposables.create()
        }
        //测试订阅
        _ = observable12.subscribe(onNext: { (string) in
            print("订阅到:\(string)")
        }, onError: { (error) in
            print(error)
        }, onCompleted: {
            print("完成")
        }) {
            print("销毁")
        }
        /*
         订阅到:hello world
         订阅到:hello swift
         完成
         销毁
         */

相关文章

网友评论

      本文标题:RxSwift中Observable的各种创建方法

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