RACSiganl:信號類,一般表示將來有數(shù)據(jù)傳遞,只要有數(shù)據(jù)改變,信號內(nèi)部接收到數(shù)據(jù),就會馬上發(fā)出數(shù)據(jù)。
信號類(RACSiganl),只是表示當(dāng)數(shù)據(jù)改變時,信號內(nèi)部會發(fā)出數(shù)據(jù),它本身不具備發(fā)送信號的能力,而是交給內(nèi)部一個訂閱者去發(fā)出。
默認(rèn)一個信號都是冷信號,也就是值改變了,也不會觸發(fā),只有訂閱了這個信號,這個信號才會變?yōu)闊嵝盘?,值改變了才會觸發(fā)。
如何訂閱信號:調(diào)用信號RACSignal的
subscribeNext就能訂閱。1、 什么時候使用RACSiganl
RACSignal:有數(shù)據(jù)產(chǎn)生的時候,就使用RACSignal
- 2、 RACSignal使用步驟:
- 1.創(chuàng)建信號
+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe - 2.訂閱信號 ,才會激活信號.
- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock - 3.發(fā)送信號
- (void)sendNext:(id)value
RACSignal底層實現(xiàn):
- 1.創(chuàng)建信號,首先把didSubscribe保存到信號中,還不會觸發(fā)。
- 2.當(dāng)信號被訂閱,也就是調(diào)用signal的subscribeNext:nextBlock
- 2.2 subscribeNext內(nèi)部會創(chuàng)建訂閱者subscriber,并且把nextBlock保存到subscriber中。
- 2.1 subscribeNext內(nèi)部會調(diào)用siganl的didSubscribe
- 3.siganl的didSubscribe中調(diào)用[subscriber sendNext:@1];
- 3.1 sendNext底層其實就是執(zhí)行subscriber的nextBlock
代碼如下:
- (void)viewDidLoad {
[super viewDidLoad];
// 1.創(chuàng)建信號
RACSignal *siganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// block調(diào)用時刻:每當(dāng)有訂閱者訂閱信號,就會調(diào)用block。
// 2.發(fā)送信號
[subscriber sendNext:@1];
// 如果不在發(fā)送數(shù)據(jù),最好發(fā)送信號完成,內(nèi)部會自動調(diào)用 [RACDisposable disposable]取消訂閱信號。
[subscriber sendCompleted];
return [RACDisposable disposableWithBlock:^{
// block調(diào)用時刻:當(dāng)信號發(fā)送完成或者發(fā)送錯誤,就會自動執(zhí)行這個block,取消訂閱信號。
// 執(zhí)行完Block后,當(dāng)前信號就不在被訂閱了。
NSLog(@"信號被銷毀");
}];
}];
// 3.訂閱信號,才會激活信號.
[siganl subscribeNext:^(id x) {
// block調(diào)用時刻:每當(dāng)有信號發(fā)出數(shù)據(jù),就會調(diào)用block.
NSLog(@"接收到數(shù)據(jù):%@",x);
}];
代碼練習(xí):
- (void)viewDidLoad {
[super viewDidLoad];
RACDisposable *(^didSubscribe)(id<RACSubscriber> subscriber) = ^RACDisposable *(id<RACSubscriber> subscriber) {
// didSubscribe調(diào)用:只要一個信號被訂閱就會調(diào)用
// didSubscribe作用:發(fā)送數(shù)據(jù)
NSLog(@"信號被訂閱");
// 3.發(fā)送數(shù)據(jù)
[subscriber sendNext:@1];
return nil;
};
// 1.創(chuàng)建信號(冷信號)
RACSignal *signal = [RACSignal createSignal:didSubscribe];
// 2.訂閱信號(熱信號)
[signal subscribeNext:^(id x) {
// nextBlock調(diào)用:只要訂閱者發(fā)送數(shù)據(jù)就會調(diào)用
// nextBlock作用:處理數(shù)據(jù),展示到UI上面
// x:信號發(fā)送的內(nèi)容
NSLog(@"%@",x);
}];
// 只要訂閱者調(diào)用sendNext,就會執(zhí)行nextBlock
// 只要訂閱RACDynamicSignal,就會執(zhí)行didSubscribe
// 前提條件是RACDynamicSignal,不同類型信號的訂閱,處理訂閱的事情不一樣
}