iOS 初探ReactiveCocoa

一.ReactiveCocoa(簡稱為RAC)是由Github開源的一個應(yīng)用于iOS和OS開發(fā)的新框架,Cocoa是蘋果整套框架的簡稱,因此很多蘋果框架喜歡以Cocoa結(jié)尾。

我也是才剛剛學習,將學到的東西記錄下來:

  • 1.RAC中RACSignal信號類是核心:
    1.1創(chuàng)建一個信號:
    創(chuàng)建信號:
 RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        發(fā)送信號
        [subscriber sendNext:@"五哥最帥"];
        取消信號,如果信號想被取消,就必須返回一個RACDisposable
        信號什么時候被取消:
1.自動取消,當一個信號的訂閱者被銷毀的時候就會自動取消訂閱 
2.手動取消.
        block什么時候調(diào)用:一旦這個信號被取消和訂閱就會執(zhí)行block內(nèi)的代碼
        block作用:當信號被取消的時候用于清空一些資源
        return [RACDisposable disposableWithBlock:^{
            NSLog(@"取消訂閱!!!");
        }];
    }];
訂閱信號:subscribeNext
把nextBlock保存到訂閱者里面
只要訂閱信號就會返回一個取消訂閱信號的類
    RACDisposable *disposable = [signal subscribeNext:^(id x) {
        NSLog(@"----- %@", x);
    }];
    取消訂閱
    [disposable dispose];

RACSignal總結(jié):

  • 1.核心:
  • 1.1核心:信號類
  • 1.2信號類的作用:只要有數(shù)據(jù)改變就會把數(shù)據(jù)包裝成信號傳遞出去.
  • 1.3只要有數(shù)據(jù)改變就會信號發(fā)出.
  • 1.4數(shù)據(jù)發(fā)出去,不是信號類發(fā)出去,信號類不能發(fā)送數(shù)據(jù)

二.使用方法:

  • 2.1創(chuàng)建信號
  • 2.2訂閱信號
  • 2.3取消訂閱

三.實現(xiàn)思路:

  • 3.1當一個信號被訂閱,創(chuàng)建訂閱者,并把nextBlock并存到訂閱者里面.
  • 3.2創(chuàng)建的時候會返回[RACDynamicSignal createSignal:didSubscribe];
  • 3.3調(diào)用RACDynamicSignal的didSubscribe
  • 3.4發(fā)送信號[subscriber sendNext:value];
  • 3.5拿到訂閱者的nextBlock調(diào)用

二:快速進行遍歷字典或者是數(shù)組:RACTupleUnpack宏:專門用來解析元祖

NSDictionary *dict = @{@"key1":@"One",@"key2":@"two",@"key3":@"three",@"key4":@"four",@"key5":@"five",@"key6":@"six",@"key7":@"seven",@"key8":@"engit",@"key9":@"nine"}; [dict.rac_sequence.signal subscribeNext:^(id x) {

  • RACTupleUnpack等號右邊:需要解析元組宏的參數(shù),左邊:填解析什么的數(shù)據(jù)元組里面有幾個值,宏的參數(shù)必須填幾個
RACTupleUnpack(NSString *key, NSString *value) = x;
        NSLog(@"key = %@, ---  value = %@", key, value);
   }
    error:^(NSError *error) {
         
     } completed:^{
         
     }];
  • 當有多個訂閱者,但是我們只想發(fā)送一個信號怎么辦?
    RACMulticastConnection 我們用這個就可以實現(xiàn)了.
  • 第一種寫法(普通寫法:這樣的缺點是:每訂閱一次信號就得重新創(chuàng)建并發(fā)送請求,這樣很不友好)
   RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@"ws"];
        NSLog(@"發(fā)送請求啦");
        return [RACDisposable disposableWithBlock:^{
            
            NSLog(@"qqqqqqqq");
      }];
   }];

訂閱信號(我下面訂閱的三次信號,通過打印可以知道,signal一共創(chuàng)建了三次).

    [signal subscribeNext:^(id x) {
        NSLog(@"x = %@", x);
    }];
    [signal subscribeNext:^(id x) {
        NSLog(@"x = %@", x);
    }];
    [signal subscribeNext:^(id x) {
        NSLog(@"x = %@", x);
    }];
    RACDisposable *disposable = [signal subscribeNext:^(id x) {
        NSLog(@"ss = %@", x);
        
    }];
    //取消訂閱
    [disposable dispose]; 
}
  • 使用這種方法來解決上面出現(xiàn)的問題
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
 比較好的做法,使用RACMulticastConnection,無論多少個訂閱者,無論訂閱多少次,我只創(chuàng)建一個信號并只發(fā)送一次.
發(fā)送請求用一個信號內(nèi)包裝,不管有多少個訂閱者,只想發(fā)送一次請求;
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        NSLog(@"發(fā)送信號了!!!");
        [subscriber sendNext:@"發(fā)送信號!"];
        
       return [RACDisposable disposableWithBlock:^{
           NSLog(@"取消訂閱");
       }];
    }];
1.創(chuàng)建連接類:

RACMulticastConnection *connection = [signal publish];

2.訂閱信號:

[connection.signal subscribeNext:^(id x) {
NSLog(@"1 = %@", x);
}];
[connection.signal subscribeNext:^(id x) {
NSLog(@"2 = %@", x);
}];
[connection.signal subscribeNext:^(id x) {
NSLog(@"3 = %@", x);
}];
[connection.signal subscribeNext:^(id x) {
NSLog(@"4 = %@", x);
}];

3.連接,只有連接了才會把信號源變?yōu)闊嵝盘?

[connection connect];

4.看打印發(fā)現(xiàn)信號類只創(chuàng)建了一次666666

    RACDisposable *disposable = [connection.signal subscribeNext:^(id x) {
        
        NSLog(@"apapapa");
    }];
    [disposable dispose];
}

持續(xù)更新............

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容