RACSiganl的簡單使用

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

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

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