publicenumEvent<Element> { /// Next element is produced. case next(Element) /// Sequence terminated with an error. case error(Swift.Error) /// Sequence completed successfully. case completed }
let ob =Observable.from([123, 1234, 12345]) // let ob = Observable<[Int]>.just([123, 1234, 12345])
可以接受数组参数,和上面的just()方法是同样的效果
empty()、never()
1 2
let ob =Observable<Int>.empty() // let ob = Observable<Int>.never()
创建一个空序列,创建一个不发出也不终止的序列
error()
1
let ob =Observable<Int>.error(Error)
创建一个没有操作,直接发送一个错误的序列
range()
1
let ob =Observable.range(start: 1, count: 5)
类似于python的range函数?但是步长都是1
repeatElement()
1
let ob =Observable.repeatElement(1)
创建一个只会发送1的复读机
generate()
1 2 3 4 5
let ob =Observable.generate( initialState: 0, condition: { $0<=10 }, iterate: { $0+2 } )
没想到吧,我是个for循环
create()
1 2 3 4 5
let ob =Observable<Int>.create { observer in observer.onNext(123) observer.onCompleted() retrun Disposables.create() }
用闭包写了个函数
defered()
1 2 3 4 5 6 7 8 9
var para ="Char" let factory =Observable<Any>.deferred { switch para { case"Int": returnObservable.of(1, 2, 3, 4) case"Char": returnObservable.of("a", "b", "c", "d") } }
根据参数值来有不同的初始化
interval()
1 2 3 4
let ob =Observable<Int>.interval(1, scheduler: MainScheduler.instance) ob.subscribe { event in print(event) }
间隔时间生成从0开始的索引数
timer()
1 2
let ob =Observable<Int>.timer(5, scheduler: MainScheduler.instance) // 延时5秒后发出一个 // let ob = Observable<Int>.timer(5, period: 1, scheduler: MainScheduler.instance) // 延时5秒后间隔1秒重复发出
高级interval,加入了延迟和可选重复功能
Obserable的订阅
既然创建了序列,那么也需要接收方法
不分类
1 2 3 4
let ob =Observable.of("a", "b", "c") ob.subscribe { event in print(event) }
1 2 3 4
let ob =Observable.of("a", "b", "c") ob.subscribe { event in print(event.element) }
分类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
let ob =Observable.of("a", "b", "c") ob.subscribe ( onNext: { element in print(element) }, onError: { error in print(error) }, onCompleted: { print("Completed") }, onDisposed: { print("Disposed") } )
当然四种类型都是可选的,可以只有onNext
监听事件的生命周期
doOn、doAfterOn
1 2 3 4 5 6 7 8 9 10 11 12
let ob =Observable.of("a", "b", "c") ob .do(onNext: { element in print("will print \(element)") }, afterNext: { element in print("did print \(element)") }) .subscribe ( onNext: { element in print(element) } )
dispose
1 2 3 4
let ob =Observable.of("a", "b", "c") ob.subscribe { event in print(event.element) }.dispose()
let ob =Observable<Int>.interval(1, scheduler: MainScheduler.instance) ob .map { "当前索引: \($0)" } .bind { text in self.label.text = text }
使用AnyObserver
subscribe
1 2 3 4 5 6 7 8 9 10 11 12
let observer =AnyObserver<Int> { event in switch event { case .next(let data): print(data) case .error(let error): print(error) case .completed: print("completed") } }
ob.subscribe(observer)
bind
1 2 3 4 5 6 7 8 9 10 11 12 13 14
let observer =AnyObserver<String> { event in switch event { case .next(let text): self.label.text = text default: break } } ob .map { "当前索引: \($0)" } .bind(to: observer)
Binder
Binder比起AnyObserver主要有两个特征:
不会处理错误
确保绑定都是在给定Scheduler上执行
1 2 3 4 5 6 7 8 9
let observer =Binder<String>(label) { view, text in view.text = text } ob .map { "当前索引: \($0)" } .bind(to: observer)
自定义可绑定属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14
....// viewDidLoad let ob =Observable<Int>.interval(0.5, scheduler: MainScheduler.instance) ob .map { CGFloat($0) } .bind(to: label.rx.fontSize) ....