Observables
Observables是一个事件流的对象,通过以下的函数可以生成一个事件流。
- empty
- just
- of
- toObservable
- create
- error
- deffered
通过subscribe方法可以监听订阅流中的数据,在闭包中进行必要的逻辑编程。
热信号vs冷信号
信号分两种,热信号在它创建的时候就开始推送事件,这意味着如果后面有订阅者来的时候,就可能会错过一些事件。而冷信号则不会,只有在它被订阅的时候,它才会发送事件,这可以保证后面即使有订阅者中途加入的时候也能收到完整的事件序列。
## empty 函数
通过empty函数,可以生成一个空的流,在这个流中只会产生一个Completed信息。
在下面的代码中,只会打印出 Completed。
// 产生一个流对象
let emptyStream: Observable<Int> = Observable.empty()
// 订阅这个流
let subscription = emptyStream
.subscribe { event in
print(event)
}
never 函数
通过never函数产生的流对象,将不会有任何的事件发生。
let neverStream: Observable<String> = Observable.never()
let subscription = neverStream
.subscribe { _ in
print(\”这个方法永远都不会被执行\”)
}
just 函数
just函数调用之后将会产生一个next事件以及一个Completed事件,其中next可以用来传递数据,最后的Completed事件发送之后将不会再有事件了。
简单的说:just函数可以发送一个数据。
let singleElementStream = Observable.just(32)
let subscription = singleElementStream
.subscribe { event in
print(event)
}
通过上面的代码将会输出
Next(32)
Completed
of 函数
of函数与just函数不同,它可以将一个集合内的数据所有数据顺序的发送出去。
let stream = Observable.of(0,1,2)
stream.subscribe{ event in
print(event)
}
通过上面的代码将会输出
Next(0)
Next(1)
Next(2)
Completed
toObservable 函数
toObservable函数可是一个非常好用的,通过这个函数可以将一个集合对象(比如数组、Range等)转换成流对象,通过订阅可以获得这个集合对象的所有内容。
let streamFromArray = [0, 1, 2].toObservable()
let subscription = streamFromArray
.subscribe { event in
print(event)
}
上面的代码执行结果和of函数的结果一样。
create 函数
create函数是通过利用闭包来生成流对象的函数,通过下面的例子制作了一个自定义的just函数。
// 定义一个自定义的Observable用来实现自定义的just方法
let myJust = { (singleElement: Int) -> Observable <Int> in
return Observable.create({ (observer) -> Disposable in
observer.onNext(singleElement)
observer.onCompleted()
return NopDisposable.instance
})
}
// 输出结果与Observable的just方法一致
let singleElementStream = myJust(32)
singleElementStream.subscribe { (event) in
print(event)
}
error 函数
通过error函数将会生成一个终止的流,这个流中只会产生一次error事件并结束掉。
let error = NSError(domain: \”net.xloli.rxswiftdemo.errortest\”, code: -1 , userInfo: nil)
let erroredStream : Observable<Int> = Observable.error(error)
erroredStream.subscribe { (event) in
print(event)
}
上面的代码将会输出一个Error信息
Error(Error Domain=net.xloli.rxswiftdemo.errortest Code=-1 \”(null)\”)
deffered 函数
deffered函数生成的流对象,只有在添加了订阅者才会被创建。
let deferredStream : Observable<Int> = Observable.deferred {
print(\”开始创建Observable对象\”)
return Observable.create({ (observer) -> Disposable in
print(\”正在创建中…\”)
observer.onNext(0)
observer.onNext(1)
return NopDisposable.instance
})
}
print(\”开始创建第一个订阅者\”)
let firstSubscription = deferredStream.subscribe { (event) in
print(event)
}
print(\”开始创建第二个订阅者\”)
let secondSubscription = deferredStream.subscribe { (event) in
print(event)
}
通过上面的代码将会有以下的输出
开始创建第一个订阅者
开始创建Observable对象
正在创建中…
Next(0)
Next(1)
开始创建第二个订阅者
开始创建Observable对象
正在创建中…
Next(0)
Next(1)
A | B | C |
---|---|---|
D | E | F |