简介
时隔1年,随着项目的推移和时间的变迁,swift语言的不断完善和进步,我们技术方向也随之改变,由之前的oc逐渐在项目中全面的使用swift的,我们在oc版本已经很成熟的使用响应式编程框架,所以在swift希望继续沿用,而且之前在swift中3.0版本有使用的经验,所以本次我们直接采用最新版本rxswift4.0进行开发,在这里我们只对基本的方法进行分析和演练,足以满足正常开发。
相信再好的描述抵不过自己编写运行体会的深刻,所以我直接开门见山,直接上代码。
Observable(被观察者)
RxSwift中的Observable 是观察者模式中被观察的对象,相当于一个事件序列 (GeneratorType) ,会主动向订阅者发送新产生的事件信息。事件类型分为以下三种:
.onNext(element) 表示新的事件数据。
.onError(error) 表示事件序列因异常而完结。
.onCompleted() 表示事件序列完结。
Subscribe(订阅者)
如果只有一个Observable被创建,而没有被任何的订阅者所订阅的话,那么什么事情都不会发生。所以我们需要创建一个订阅者,来响应事件的触发。
1、创建信号——>订阅
//创建信号
var single1 = Observable<String>.create { (result) -> Disposable in
print("create")
result.onNext("1")
result.onCompleted()
return Disposables.create()
}
//订阅信号
func singleFoucation() -> Void {
single1.subscribe(onNext: { (result) in
print(result)
}, onError: nil, onCompleted: {
print("onCompleted1")
}) {
print("onDisposed1")
}.disposed(by: self.disposeBag)
}
//这里可以代替跨页面的传值(block)
2、空信号只会返回onCompleted信号
var single2 = Observable<Any>.empty()
//空信号只会返回onCompleted信号
func singleFoucation2() -> Void {
single2.subscribe(onNext: { (reslute) in
print(reslute)
}, onError: nil, onCompleted: {
print("onCompleted2")
}, onDisposed: nil).disposed(by: self.disposeBag)
}
//这里可以代替点击事件的跨页面响应(block)
3、just信号(快速创建信号,可完全代替block传值)
var single3 = Observable<String>.just("just")
//just信号
func singleFoucation3() -> Void {
single3.subscribe(onNext: { (reslute) in
print(reslute)
}, onError: nil, onCompleted: {
print("onCompleted3")
}, onDisposed: nil).disposed(by: self.disposeBag)
}
4、of序列(依次进行输出,可结合map,filter)
var single4 = Observable<Any>.of("1",["1":2],3,"4")
//of序列
func singleFoucation4() -> Void {
single4.subscribe(onNext: { (reslute) in
print(reslute)
}, onError: nil, onCompleted: {
print("onCompleted4")
}, onDisposed: nil).disposed(by: self.disposeBag)
}
5、from序列(从一个序列创建一个可被观察的序列。这里使用$0表示默认的第一个参数,个人感觉完全可以用of代替)
var single5 = Observable<Any>.from(["1",["1":2],3,"4"])
//from序列
func singleFoucation5() -> Void {
single5.subscribe(onNext: { (reslute) in
print(reslute)
}, onError: nil, onCompleted: {
print("onCompleted5")
}, onDisposed: nil).disposed(by: self.disposeBag)
}
6、range序列(创建一个发出一系列顺序整数然后终止的序列)
var single6 = Observable.range(start: 0, count: 10)
//range序列
func singleFoucation6() -> Void {
single6.subscribe(onNext: { (reslute) in
print(reslute)
}, onError: nil, onCompleted: {
print("onCompleted6")
}, onDisposed: nil).disposed(by: self.disposeBag)
}
7、generate序列 (创建一个满足条件的序列,可以类比for循环)
var single7 = Observable.generate(initialState: 0, condition: { (result) -> Bool in
return result < 10
}, iterate:{$0+1})
//generate序列
func singleFoucation7() -> Void {
single7.subscribe(onNext: { (reslute) in
print(reslute)
}, onError: nil, onCompleted: {
print("onCompleted7")
}, onDisposed: nil).disposed(by: self.disposeBag)
}
8、of序列do(只读,可类比for in循环)
var single8 = Observable<Any>.of("1",["1":2],3,"4").do(onNext: { (result) in
print(result)
}, onError: nil, onCompleted: nil, onSubscribe: nil, onSubscribed: nil, onDispose: nil)
//do
func singleFoucation8() -> Void {
single8.subscribe(onNext: { (reslute) in
print(reslute)
}, onError: nil, onCompleted: {
print("onCompleted7")
}, onDisposed: nil).disposed(by: self.disposeBag)
}
//do
func singleFoucation8() -> Void {
single8.subscribe(onNext: { (reslute) in
print(reslute)
}, onError: nil, onCompleted: {
print("onCompleted8")
}, onDisposed: nil).disposed(by: self.disposeBag)
}
9、subject(Subject就相当于一个桥梁或者代理,它既可以作为一个observer也可以作为一个Observable)功能可类比just信号
let subject = PublishSubject<String>()
//subject
func singleFoucation9() -> Void {
subject.asObserver().onNext("abcd")
}
func singleFoucation10() -> Void {
subject.subscribe(onNext: { (result) in
print(result)
}, onError: nil, onCompleted: nil, onDisposed: nil).disposed(by: self.disposeBag)
}
10、Variable(Variable是BehaviorSubject的封装,它和BehaviorSubject不同之处在于,不能向Variable发送.Complete和.Error,它会在生命周期结束被释放的时候自动发送.Complete)
BehaviorSubject(广播所有事件给订阅者,对于新的订阅者,广播最近的一个事件或者默认值)
[unowned self] 防止循环引用
var smsCodeMsg:Variable = Variable("123")
self.smsCodeMsg.asObservable().subscribe(onNext: { [unowned self] (message) in
self.textField.errorMessage = message
}, onError: nil).disposed(by: disposeBag)