RACSubject使用步驟
- 1.創(chuàng)建信號(hào) [RACSubject subject]掘鄙,跟RACSiganl不一樣耘戚,創(chuàng)建信號(hào)時(shí)沒(méi)有block。
- 2.訂閱信號(hào) - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
- 3.發(fā)送信號(hào) sendNext:(id)value
RACSubject:底層實(shí)現(xiàn)和RACSignal不一樣操漠。
- 1.調(diào)用subscribeNext訂閱信號(hào)收津,只是把訂閱者保存起來(lái),并且訂閱者的nextBlock已經(jīng)賦值了浊伙。
- 2.調(diào)用sendNext發(fā)送信號(hào)撞秋,遍歷剛剛保存的所有訂閱者,一個(gè)一個(gè)調(diào)用訂閱者的nextBlock嚣鄙。
- 不同信號(hào)訂閱的方式不一樣
- RACSubject處理訂閱:僅僅是保存訂閱者
RACReplaySubject使用步驟:
- 1.創(chuàng)建信號(hào) [RACSubject subject]吻贿,跟RACSiganl不一樣,創(chuàng)建信號(hào)時(shí)沒(méi)有block哑子。
- 2.可以先訂閱信號(hào)舅列,也可以先發(fā)送信號(hào)。
- 2.1 訂閱信號(hào) - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
- 2.2 發(fā)送信號(hào) sendNext:(id)value
RACReplaySubject:底層實(shí)現(xiàn)和RACSubject不一樣卧蜓。
1.調(diào)用sendNext發(fā)送信號(hào)帐要,把值保存起來(lái),然后遍歷剛剛保存的所有訂閱者弥奸,一個(gè)一個(gè)調(diào)用訂閱者的nextBlock榨惠。
-
2.調(diào)用subscribeNext訂閱信號(hào),遍歷保存的所有值盛霎,一個(gè)一個(gè)調(diào)用訂閱者的nextBlock
- 如果想當(dāng)一個(gè)信號(hào)被訂閱赠橙,就重復(fù)播放之前所有值,需要先發(fā)送信號(hào)愤炸,在訂閱信號(hào)期揪。
- 也就是先保存值,在訂閱值摇幻。
- (void)viewDidLoad {
[super viewDidLoad];
// 訂閱信號(hào)
[_redView.btnClickSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
}
- (void)RACReplaySubject
{
// 1.創(chuàng)建信號(hào)
RACReplaySubject *replaySubject = [RACReplaySubject subject];
// 2.發(fā)送信號(hào)
[replaySubject sendNext:@1];
[replaySubject sendNext:@2];
// 3.訂閱信號(hào)
[replaySubject subscribeNext:^(id x) {
NSLog(@"第一個(gè)訂閱者接收到的數(shù)據(jù)%@",x);
}];
// 訂閱信號(hào)
[replaySubject subscribeNext:^(id x) {
NSLog(@"第二個(gè)訂閱者接收到的數(shù)據(jù)%@",x);
}];
}
- (void)RACSubject
{
// 1.創(chuàng)建信號(hào)
RACSubject *subject = [RACSubject subject];
// 2.訂閱信號(hào)
[subject subscribeNext:^(id x) {
// block調(diào)用時(shí)刻:當(dāng)信號(hào)發(fā)出新值横侦,就會(huì)調(diào)用.
NSLog(@"第一個(gè)訂閱者%@",x);
}];
[subject subscribeNext:^(id x) {
// block調(diào)用時(shí)刻:當(dāng)信號(hào)發(fā)出新值,就會(huì)調(diào)用.
NSLog(@"第二個(gè)訂閱者%@",x);
}];
// 3.發(fā)送信號(hào)
[subject sendNext:@"1"];
// 保存訂閱者
// 底層實(shí)現(xiàn):遍歷所有的訂閱者,調(diào)用nextBlock
// 執(zhí)行流程:
// RACSubject被訂閱,僅僅是保存訂閱者
// RACSubject發(fā)送數(shù)據(jù),遍歷所有的訂閱,調(diào)用他們的nextBlock
}