最近在一直在學習RAC框架的Object-C版本ReactiveObjC(Swift版本為ReactiveSwift),這篇文章簡單展示一下學習的成果!!!如果有什么地方理解錯誤,歡迎大家指正!!!互相學習......
ReactiveObjC 這里只是拋磚引玉!!!如果有什么理解不到位的,歡迎批評指正,共同進步!!!
如果你不想了解底層是怎么實現的,那么直接上代碼 -----> ReactiveObjC使用
RAC框架中的繼承關系(不包含分類)
注意:
1、關於底層實現是三方已經自動幫我們實現的過程,我們只需要,學會使用步驟就行了,當然多了解底層原理有助於我們提升自己的能力!!!
2、不同類型信號的訂閱,處理的事情不一樣。
#pragma mark -- RAC/RACSignal
RACSignal使用步驟:
1、創建信號: + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe;
2、訂閱信號:- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock;
3、發送信號:- (void)sendNext:(id)value;
特點:先訂閱,后發送。
RACSignal底層實現:
1、創建信號:把didSubscribe(代碼塊)保存到信號中
2、訂閱信號:調用signal的subscribeNext:(void (^)(id x))nextBlock
3、調用RACDynamicSignal的didSubscribe把訂閱者傳遞過去
4、[subscriber sendNext:@1]; 調用訂閱者的發送消息的方法,發送消息
5、執行nextBlock這個代碼塊
代碼實現
//1、創建訂閱者 RACSignal * signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) { //3、發送信號,發送信號之前一定要先訂閱信號 [subscriber sendNext:@"1"]; return nil; }]; //2、訂閱信號 [signal subscribeNext:^(id _Nullable x) { NSLog(@"--%@", x); }];
圖例:
#pragma mark -- RACSubject
RACSubject使用步驟:
1、創建信號: + (instancetype)subject;
2、訂閱信號:- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock;
3、發送信號:- (void)sendNext:(id)value;
特點:先訂閱,后發送。
RACSubject底層實現
1.調用subscribeNext訂閱信號,把訂閱者保存起來,並且訂閱者的nextBlock中已經賦值了。
2.調用sendNext發送信號,遍歷剛剛保存的所有訂閱者,分別調用訂閱者的nextBlock。
代碼實現:
//1.創建信號 RACSubject *subject = [RACSubject subject]; //2.訂閱信號 [subject subscribeNext:^(id x) { // block調用時刻:當信號發出新值,就會調用. NSLog(@"第一個訂閱者%@",x); }]; [subject subscribeNext:^(id x) { // block調用時刻:當信號發出新值,就會調用. NSLog(@"第二個訂閱者%@",x); }]; //3.發送信號 [subject sendNext:@"1"];
圖例:
#pragma mark -- RACReplaySubject
RACReplaySubject使用步驟:
1、創建信號: + (instancetype)subject;
2/3、訂閱信號:- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock;
3/2、發送信號:- (void)sendNext:(id)value;
特點:可以先訂閱信號,也可以先發送信號
RACReplaySubject底層實現
1.調用sendNext發送信號,把需要發送的信號保存起來,然后遍歷剛剛保存的所有訂閱者,一個一個調用訂閱者的nextBlock。
2.調用subscribeNext訂閱信號,遍歷保存的所有值,一個一個調用訂閱者的nextBlock
如果想要當一個信號被訂閱,就重復播放之前所有值,需要先發送信號,在訂閱信號。(也就是先保存值,再訂閱值。)
代碼實現:(先發送后訂閱)
// 1.創建信號 RACReplaySubject *replaySubject = [RACReplaySubject subject]; // 2.發送信號 [replaySubject sendNext:@1]; [replaySubject sendNext:@2]; // 3.訂閱信號 [replaySubject subscribeNext:^(id x) { NSLog(@"第一個訂閱者接收到的數據%@",x); }]; // 訂閱信號 [replaySubject subscribeNext:^(id x) { NSLog(@"第二個訂閱者接收到的數據%@",x); }];
控制台打印:(先發送后訂閱)
每一個訂閱者接收全部信號(信號已經全部保存完畢)
第一個訂閱者接收到的數據1
第一個訂閱者接收到的數據2
第二個訂閱者接收到的數據1
第二個訂閱者接收到的數據2
圖例:(先發送后訂閱)
代碼實現:(先訂閱后發送)
// 1.創建信號 RACReplaySubject *replaySubject = [RACReplaySubject subject]; // 2.訂閱信號 [replaySubject subscribeNext:^(id x) { NSLog(@"第一個訂閱者接收到的數據%@",x); }]; // 訂閱信號 [replaySubject subscribeNext:^(id x) { NSLog(@"第二個訂閱者接收到的數據%@",x); }]; // 3.發送信號 [replaySubject sendNext:@1]; [replaySubject sendNext:@2];
控制台打印:(先訂閱后發送)
全部訂閱者接收同一個信號(訂閱者已經全部保存完畢)
第一個訂閱者接收到的數據1
第二個訂閱者接收到的數據1
第一個訂閱者接收到的數據2
第二個訂閱者接收到的數據2
圖例:(先訂閱后發送)
如果你不想了解底層是怎么實現的,那么直接上代碼 -----> ReactiveObjC使用
更多內容--> 博客導航 每周一篇喲!!!
有任何關於iOS開發的問題!歡迎下方留言!!!或者郵件lieryangios@126.com 雖然我不一定能夠解答出來,但是我會請教iOS開發高手!!!解答您的問題!!!