RxSwift之Observable订阅、事件监听、订阅销毁

订阅Observable

有了Observable,我们还要使用subscribe()方法来订阅它,接收它发出的Event

订阅方法1

使用subscribe()订阅一个Observable对象,该方法的block回调参数就是被发出的event事件:

  • 初始化Observable序列时设置的默认值都按顺序通过.next事件发送出来;
  • Observable序列的初始数据都发送完毕,它还会自动发一个.completed事件出来。
1
2
3
4
5
6
7
8
9
let observable = Observable.of("A","B","C")
observable.subscribe { event in
print(event)
}
//运行结果:
next(A)
next(B)
next(C)
completed

如果想要获取这个事件里的数据,可以通过event.element得到:

1
2
3
4
5
6
7
8
9
let observable = Observable.of("A","B","C")
observable.subscribe { event in
print(event.element)
}
// 运行结果
Optional("A")
Optional("B")
Optional("C")
nil
订阅方法2

使用将event进行分类的subscribe方法:

  • 通过不同的block回调处理不同类型event
  • 会把event携带的数据直接解包作为参数;
  • subscribe()方法的四个参数onNextonErroronCompletedonDisposed都是有默认值的,即它们都是可选的,可以只处理onNext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let observable = Observable.of("A","B","C")
observable.subscribe(onNext: { element in
print(element)
}, onError: { error in
print(error)
}, onCompleted: {
print("completed")
}, onDisposed: {
print("disposed")
})
//运行结果
A
B
C
completed
disposed
监听事件的生命周期
doOn
  • 使用doOn方法来监听事件的生命周期,它会在每一次事件发送前被调用;
  • doOn方法可以通过不同的block回调处理不同类型的event
  • do( onNext: )方法会在subscribe( onNext: )前调用
  • do( onCompleted: )方法会在subscribe( onCompleted: )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
let observable = Observable.of("A", "B", "C")

observable
.do(onNext: { element in
print("Intercepted Next:", element)
}, onError: { error in
print("Intercepted Error:", error)
}, onCompleted: {
print("Intercepted Completed")
}, onDispose: {
print("Intercepted Disposed")
})
.subscribe(onNext: { element in
print(element)
}, onError: { error in
print(error)
}, onCompleted: {
print("completed")
}, onDisposed: {
print("disposed")
})
Observable的销毁(dispose)

一个Observable序列被创建出来后不会马上被激活,而是要等到被订阅之后才会才激活发出Event

Observable序列被激活之后要一直等到它发出了.error或者.completedevent之后才会被销毁。

dispose() 方法
  • 手动调用dispose():取消订阅
  • 当一个订阅被dispose了,那么之后Observable如果再发出event,这个dispose的订阅就收不到消息了。
1
2
3
4
5
6
7
8
9
let observable = Observable.of("A", "B", "C")

//使用subscription常量存储这个订阅方法
let subscription = observable.subscribe { event in
print(event)
}

//调用这个订阅的dispose()方法
subscription.dispose()
DisposeBag

DisposeBag用来管理多个订阅行为的销毁,它会在自己将要被dealloc的时候,对它里面的所有订阅行为调用dispose()方法

1
2
3
4
5
6
7
8
9
10
11
12
13
let disposeBag = DisposeBag()

//第1个Observable,及其订阅
let observable1 = Observable.of("A", "B", "C")
observable1.subscribe { event in
print(event)
}.disposed(by: disposeBag)

//第2个Observable,及其订阅
let observable2 = Observable.of(1, 2, 3)
observable2.subscribe { event in
print(event)
}.disposed(by: disposeBag)