ReactiveCocoa常見類 1. RAC中最核心的類RACSiganl: RACSiganl:信號類,一般表示將來有數據傳遞,只要有數據改變,信號內部接收到數據,就會馬上發出數據 解析: 信號類(RACSiganl),只是表示當數據改變時,信號內部會發出數據,它本身不具備發送信號的能力,而是交 ...
ReactiveCocoa常見類
1. RAC中最核心的類RACSiganl:
RACSiganl
:信號類,一般表示將來有數據傳遞,只要有數據改變,信號內部接收到數據,就會馬上發出數據
解析:
-
信號類(RACSiganl),只是表示當數據改變時,信號內部會發出數據,它本身不具備發送信號的能力,而是交給內部一個訂閱者去發出。
-
預設一個信號都是冷信號,也就是值改變了,也不會觸發,只有訂閱了這個信號,這個信號才會變為熱信號,值改變了才會觸發。
-
如何訂閱信號:調用信號RACSignal的subscribeNext就能訂閱。
1 // 創建信號,首先把didSubscribe保存到信號中,還不會觸發 2 + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe 3 4 // 訂閱信號,才會激活信號 5 - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock 6 7 // 當信號被訂閱,也就是調用signal的subscribeNext:nextBlock 8 // subscribeNext內部會創建訂閱者subscriber,並且把nextBlock保存到subscriber中 9 // subscribeNext內部會調用siganl的didSubscribe 10 11 12 // 發送信號 13 - (void)sendNext:(id)value 14 15 // siganl的didSubscribe中調用[subscriber sendNext:@1]; 16 // sendNext底層其實就是執行subscriber的nextBlock
Demo:

1 RACSignal *siganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { 2 // block調用時刻:每當有訂閱者訂閱信號,就會調用block。 3 // 2.發送信號 4 [subscriber sendNext:@1]; 5 // 如果不在發送數據,最好發送信號完成,內部會自動調用[RACDisposable disposable]取消訂閱信號。 6 [subscriber sendCompleted]; 7 8 return [RACDisposable disposableWithBlock:^{ 9 // block調用時刻:當信號發送完成或者發送錯誤,就會自動執行這個block,取消訂閱信號。 10 // 執行完Block後,當前信號就不在被訂閱了。 11 12 NSLog(@"信號被銷毀"); 13 14 }]; 15 }]; 16 17 // 3.訂閱信號,才會激活信號. 18 [siganl subscribeNext:^(id x) { 19 // block調用時刻:每當有信號發出數據,就會調用block. 20 NSLog(@"接收到數據:%@",x); 21 }];View Code
列印結果:
2. RACSubscriber
表示訂閱者的意思,用於發送信號,這是一個協議,不是一個類,只要遵守這個協議,並且實現方法才能成為訂閱者。通過create創建的信號,都有一個訂閱者,幫助他發送數據。
3.RACDisposable
用於取消訂閱或者清理資源,當信號發送完成或者發送錯誤的時候,就會自動觸發它。
使用場景
:不想監聽某個信號時,可以通過它主動取消訂閱信號。
4.RACSubject
RACSubject:信號提供者,自己可以充當信號,又能發送信號。
使用場景
:通常用來代替代理,有了它,就不必要定義代理了。
RACReplaySubject
:重覆提供信號類,RACSubject的子類。
-
RACReplaySubject
與RACSubject
區別:- RACReplaySubject可以先發送信號,在訂閱信號,RACSubject就不可以。
-
使用場景一
:如果一個信號每被訂閱一次,就需要把之前的值重覆發送一遍,使用重覆提供信號類。 -
使用場景二
:可以設置capacity數量來限制緩存的value的數量,即只緩充最新的幾個值。
https://www.jianshu.com/p/87ef6720a096