ReactiveCocoa(上),ReactiveCocoa(
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的didSubscribe10 11 12 // 發送訊號13 - (void)sendNext:(id)value14 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