1、RACSignal
RacSignal是一個信號類!有如下幾個特點:
- 通過RACSignal創建出來的信號默認就是冷信號,意思就是沒有訂閱者
- 通過訂閱者訂閱信號(從冷信號變成了熱信號),有點類似OC里面的通知
- 發送信號
如何使用
//1.創建信號(冷信號)
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
//3.發送信號
[subscriber sendNext:@"我在發送信號"];
return nil;
}];
//2.訂閱信號(熱信號)
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"訂閱信號 %@", x);
}];
控制臺輸出打印
2018-04-19 00:54:49.494659+0800 RAC的簡單使用以及應用場景[10016:421580] 訂閱信號 我在發送信號
2、RACSignal調用原理
首先我們知道 RACSignal 在創建信號的時候有一個block,那么這個block在什么時候被調用的呢! 其實用 RACSignal 創建的信號當冷信號變為熱信號時就會調用,也就是說只要訂閱了這個信號就會走進該blcok。
我們點進去創建信號 createSignal 方法, 看到了一個didSubscribe的參數,那么這個didSubscribe這個參數是用來做什么的呢!
兩個作用:
1、只要一個信號被訂閱就會調用
2、利用subscriber發送數據
在下段代碼塊中我們看到了這里創建一個信號,并且返回的是 RACDynamicSignal 并且把你傳進來的 didSubscribe 原封不動的給了 RACDynamicSignal
+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
return [RACDynamicSignal createSignal:didSubscribe];
}
再點擊進入 createSignal 方法,看看他到底拿了我的 didSubscribe 做了什么事情?
1、創建一個消息對象
RACDynamicSignal *signal = [[self alloc] init];
2、對你的block進行copysignal->_didSubscribe = [didSubscribe copy];
3、返回信號,注意這是時候傳進來的 didSubscribe 保存在了我們的代碼里,但是還并沒有被調用
+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
RACDynamicSignal *signal = [[self alloc] init];
signal->_didSubscribe = [didSubscribe copy];
return [signal setNameWithFormat:@"+createSignal:"];
}
現在我們來看看訂閱信號 subscribeNext 這個方法是用來做什么的呢!其實只要訂閱者發送數據就會調用,我們點進訂閱信號 subscribeNext 的方法,看到了一個 nextBlock 的參數,那么這個 nextBlock 參數是用來做什么的呢!
兩個作用:
1、只要訂閱者發送數據就會調用
2、處理數據
在下段代碼中的 nextBlock 其實就是在訂閱信號時的參數,也就是說相當外界的 x參數 也就是block ,當它拿到這個block的時候先創建一個訂閱者 RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:NULL];
,在調用 return [self subscribe:o];
才是真正的創建了一個訂閱者。
- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock {
NSCParameterAssert(nextBlock != NULL);
RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:NULL];
return [self subscribe:o];
}
我們先來看看 subscriberWithNext: error: completed:
這個方法到底干了什么事
1、原來在這個方法中它只是創建一個訂閱者
2、返回訂閱者
+ (instancetype)subscriberWithNext:(void (^)(id x))next error:(void (^)(NSError *error))error completed:(void (^)(void))completed {
RACSubscriber *subscriber = [[self alloc] init];
subscriber->_next = [next copy];
subscriber->_error = [error copy];
subscriber->_completed = [completed copy];
return subscriber;
}
我們再來看看 return [self subscribe:o];
這個方法又做了什么事?
它首先判斷didSubscribe是否為空,也就是創建信號的block,如果有值就執行,就把你保存的block進行調用,
#pragma mark Managing Subscribers
- (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber {
NSCParameterAssert(subscriber != nil);
RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable];
subscriber = [[RACPassthroughSubscriber alloc] initWithSubscriber:subscriber signal:self disposable:disposable];
if (self.didSubscribe != NULL) {
RACDisposable *schedulingDisposable = [RACScheduler.subscriptionScheduler schedule:^{
RACDisposable *innerDisposable = self.didSubscribe(subscriber);
[disposable addDisposable:innerDisposable];
}];
[disposable addDisposable:schedulingDisposable];
}
return disposable;
}
demo源代碼已放置GitHub地址https://github.com/JunAILiang/RAC_Demo
聯系我:
qq: 1245424073
微信: liujunmin6980