(三)RxSwift之Observable的创建

1,040 阅读3分钟
类型 描述
empty 创建一个空的序列-但是只能订阅到completed
just 构建一个只有一个元素的Observable队列的-订阅完成信息自动completed
of 创建一个固定数量的Observable序列
from 从一个序列(如Array/Dictionary/set)中创建一个Observable序列
deferred 为每一个订阅者创建一个新的Observable序列
generate 创建一个Observable序列,只要提供条件值为true就可以生成值
error 创建一个不会发送任何条目并且立即终止错误的Observable序列
range 创建一个Observable序列,它会发出一系列连续的整数,然后终止
timer 获取计时器Observable序列
interval 底层就是封装timer
  • empty

首先来一个空的序列 - 本来序列事件是Int类型的,这里调用empty函数 没有序列,只能completed

let emptyOb = Observable<Int>.empty()
_ = emptyOb.subscribe(onNext: { (num) in
    print("订阅:", num)
}, onError: { (error) in
    print("error:", error)
}, onCompleted: {
    print("完成回调")
}) {
    print("释放回调")
}
  • just

单个信号序列创建 订阅整个数组

let array = ["element1", "element2"]
_ = Observable<[String]>.just(array).subscribe(onNext: { (name) in
    print("订阅:",name)
}, onError: { (error) in
    print("error:", error)
}, onCompleted: {
    print("完成回调")
}) {
    print("释放回调")
}
  • of

多个元素 - 针对序列处理

_ = Observable<String>.of("element1", "element2").subscribe(onNext: { (name) in
   print("订阅:",name)
}, onError: { (error) in
    print("error:", error)
}, onCompleted: {
    print("完成回调")
}) {
    print("释放回调")
}

字典

Observable<[String: Any]>.of(["name":"马小撂","age":18])
    .subscribe { (event) in
        print(event)
    }.disposed(by: disposeBag)

数组

Observable<[String]>.of(["element1","element2"])
    .subscribe { (event) in
        print(event)
    }.disposed(by: disposeBag)
  • from

多个元素 - 针对序列处理 从集合中获取序列:数组,字典,set 获取序列 - 有可选项处理 - 更安全

Observable<[String]>.from(optional: ["element1","element2"])
    .subscribe { (event) in
        print(event)
    }.disposed(by: disposeBag)
  • defer

这里有一个需求:动态序列 - 根据外界的标识 - 动态输出 使用deferred()方法延迟Observable序列的初始化,通过传入的block来实现Observable序列的初始化并且返回。

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)
}
  • range

生成指定范围内的可观察整数序列。

Observable.range(start: 2, count: 5)
    .subscribe { (event) in
        print(event)
    }.disposed(by: disposeBag)
  • generate

该方法创建一个只有当提供的所有的判断条件都为 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)

数组遍历

let arr = ["element_1","element_2","element_3","element_4","element_5","element_6","element_7","element_8","element_9","element_10"]
Observable.generate(initialState: 0,// 初始值
    condition: { $0 < arr.count}, // 条件1
    iterate: { $0 + 1 })  // 条件2 +2
    .subscribe(onNext: {
        print("遍历arr:",arr[$0])
    })
    .disposed(by: disposeBag)
  • timer

第一次参数:第一次响应距离现在的时间

第二个参数:时间间隔

第三个参数:线程

Observable<Int>.timer(5, period: 2, scheduler: MainScheduler.instance)
    .subscribe { (event) in
        print(event)
    }
    .disposed(by: disposeBag)

因为没有指定期限period,故认定为一次性

_ = Observable<Int>.timer(1, scheduler: MainScheduler.instance)
    .subscribe { (event) in
        print("111111111 \(event)")
    }
    .disposed(by: disposeBag)
  • interval

定时器

 _ = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
    .subscribe { (event) in
        print(event)
    }
    //.disposed(by: disposeBag)
  • repeatElement

该方法创建一个可以无限发出给定元素的 EventObservable 序列(永不终止)

_ = Observable<Int>.repeatElement(5)
    .subscribe { (event) in
        print("repeatElement 订阅:",event)
    }
  • error

对消费者发出一个错误信号

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

该方法创建一个永远不会发出 Event(也不会终止)的 Observable 序列。

这种类型的响应源 在测试或者在组合操作符中禁用确切的源非常有用

Observable<String>.never()
    .subscribe { (event) in
        print("走你",event)
    }
    .disposed(by: disposeBag)
    print("********never********")