iOS ReactiveObjC使用詳解

項目地址:ReactiveObjC

1.鍵值觀察--監(jiān)聽TF的值發(fā)生變化

- (void)demo1{
  @weakify(self);
  [self.tF.rac_textSignal subscribeNext:^(NSString *value) {
      @strongify(self);
    
      self.value = value;
    
    
  }];

  //當self.value的值變化時調(diào)用Block,這是用KVO的機制凶赁,RAC封裝了KVO

  [RACObserve(self, value) subscribeNext:^(NSString *value) {
    
      NSLog(@"%@",value);
    
  }];
}

2. map的使用

- (void)demo2{
 //創(chuàng)建一個信號
  RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
     //這個信號里面有一個Next事件的玻璃球和一個complete事件的玻璃球
      [subscriber sendNext:@"唱歌"];
      [subscriber sendCompleted];
      return nil;

  }];

  //對信號進行改進,當信號里面流的是唱歌.就改進為'跳舞'返還給self.value

  RAC(self, tF.text) = [signalA map:^id(NSString *value) {
      if ([value isEqualToString:@"唱歌"]) {
         return @"跳舞";
      }
      return @"";
    
  }];       
}

3.filter使用,你向西,他就向東,他向左圆丹,你就向右。

- (void)demo3{

  //創(chuàng)建兩個通道,一個從A流出的通道A,和一個從B流出的通道B
  RACChannelTerminal *channelA = RACChannelTo(self, value);
  RACChannelTerminal *channelB = RACChannelTo(self,value2);

  //改造通道A,使通過通道A的值,如果等于'西',就改為'東'
  [[channelA map:^id(NSString *value) {
      if ([value isEqualToString:@"西"]) {
          NSLog(@"東");
          return @"東";
        
      }
      NSLog(@"====== %@",value);
      return value;
  }] subscribe:channelB];//通道A流向B

  //改造通道B,使通過通道B的值,如果等于'左',就改為'右'傳出去
  [[channelB map:^id(id value) {
      if ([value isEqualToString:@"左"]) {
          NSLog(@"右");
          return @"右";
      }
      NSLog(@"====== %@",value);
     return value;
    
  }] subscribe:channelA];//通道B流向通道A

  //KVO監(jiān)聽valueA的值的變化,過濾valueA的值,返回Yes表示通過
  //只有value有值,才可通過
  [[RACObserve(self, value) filter:^BOOL(id value) {
   
      return value ? YES : NO;
    
  }] subscribeNext:^(id x) {
    
      NSLog(@"你向%@",x);
    
  }];

  //KVO監(jiān)聽value2的變化
  [[RACObserve(self, value2) filter:^BOOL(id value) {
      return value ? YES: NO;
  }] subscribeNext:^(id x) {
      NSLog(@"他向%@",x);
  }];

  //下面使value的值和value2的值發(fā)生改變
  self.value = @"西";
  self.value2 = @"左";  
}

4.代理

/**
 *  RACSubject:信號提供者,自己可以充當信號,又能發(fā)送信號
 創(chuàng)建方法:
 1.創(chuàng)建RACSubject
 2.訂閱信號
 3.發(fā)送信號
 工作流程:
 1.訂閱信號,內(nèi)部保存了訂閱者,和訂閱者相應(yīng)block
 2.當發(fā)送信號的,遍歷訂閱者,調(diào)用訂閱者的nextBolck

 注:如果訂閱信號,必須在發(fā)送信號之前訂閱信號,不然收不到信號,有利用區(qū)別RACReplaySubject

 */

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
  RacSubjectController *racsub = [[RacSubjectController alloc] init];
  racsub.subject = [RACSubject subject];
  [racsub.subject subscribeNext:^(id x) {
      NSLog(@"被通知了%@",x);
  }];
  [self.navigationController pushViewController:racsub animated:YES];

}

在RacSubjectController.h里面聲明屬性

@property (nonatomic, strong) RACSubject *subject;

.m里面進行數(shù)據(jù)的傳遞

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

  if (self.subject) {
    [self.subject sendNext:@1];

  }

}

5.廣播

//發(fā)送通知
- (void)demo5{
  NSNotificationCenter *center = [NSNotificationCenter defaultCenter];

  //發(fā)送廣播通知
  [center postNotificationName:@"婦女之友" object:nil userInfo:@{@"技巧":@"用心聽"}];


}

//接收通知

NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
//RAC的通知不需要我們手動移除
//注冊廣播通知
RACSignal *siganl = [center rac_addObserverForName:@"婦女之友" object:nil];
//設(shè)置接收通知的回調(diào)處理
[siganl subscribeNext:^(NSNotification *x) {

  NSLog(@"技巧: %@",x.userInfo[@"技巧"]);
}];

6.兩個信號串聯(lián),兩個管串聯(lián),一個管處理完自己的東西,下一個管才開始處理自己的東西

- (void)demo6{

  //創(chuàng)建一個信號管A
  RACSignal *siganlA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
      [subscriber sendNext:@"吃飯"];
      [subscriber sendCompleted];
      return nil;
    
  }];

  //創(chuàng)建一個信號管B
  RACSignal *siganlB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
   
      [subscriber sendNext:@"吃的飽飽的,才可以睡覺的"];
      [subscriber sendCompleted];
      return nil;
  }];

  //串聯(lián)管A和管B
  RACSignal *concatSiganl = [siganlA concat:siganlB];
  //串聯(lián)后的接收端處理 ,兩個事件,走兩次,第一個打印siggnalA的結(jié)果,第二次打印siganlB的結(jié)果
  [concatSiganl subscribeNext:^(id x) {
      NSLog(@"%@",x);
    
  }];

}

7.并聯(lián),只要有一個管有東西,就可以打印

- (void)demo7{
  //創(chuàng)建信號A
  RACSignal *siganlA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    [subscriber sendNext:@"紙廠污水"];
    [subscriber sendCompleted];
    return nil;
  }];

  //創(chuàng)建信號B
  RACSignal *siganlB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
   
    [subscriber sendNext:@"電鍍廠污水"];
    [subscriber sendCompleted];
    return nil;
  }];

  //并聯(lián)兩個信號,根上面一樣,分兩次打印
  RACSignal *mergeSiganl = [RACSignal merge:@[siganlA,siganlB]];
  [mergeSiganl subscribeNext:^(id x) {
   
    NSLog(@"%@",x);
    
  }];

}

8.組合,只有兩個信號都有值,才可以組合

- (void)demo8{
  //定義2個自定義信號
  RACSubject *letters = [RACSubject subject];
  RACSubject *numbers = [RACSubject subject];

  //組合信號
  [[RACSignal combineLatest:@[letters,numbers] reduce:^(NSString *letter, NSString *number){
    
      return [letter stringByAppendingString:number];
  }] subscribeNext:^(id x) {
      NSLog(@"%@",x);
    
  }];


  //自己控制發(fā)生信號值
  [letters sendNext:@"A"];
  [letters sendNext:@"B"];
  [numbers sendNext:@"1"]; //打印B1
  [letters sendNext:@"C"];//打印C1
  [numbers sendNext:@"2"];//打印C2



}

9.合流壓縮

- (void)demo9{

 //創(chuàng)建信號A
  RACSignal *siganlA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
   
      [subscriber sendNext:@"紅"];
      [subscriber sendCompleted];
      return nil;
  }];

  //創(chuàng)建信號B
  RACSignal *siganlB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
   
      [subscriber sendNext:@"白"];
      [subscriber sendCompleted];
      return nil;
  }];

  //合流后處理的是壓縮包,需要解壓后才能取到里面的值
  [[siganlA zipWith:siganlB] subscribeNext:^(id x) {
   
      //解壓縮
      RACTupleUnpack(NSString *stringA, NSString *stringB) = x;
      NSLog(@"%@ %@",stringA, stringB);
  }];

}

10.映射,我可以點石成金

- (void)demo10{
  RACSignal *siganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
      [subscriber sendNext:nil];
      [subscriber sendCompleted];
      return nil;
  }];
  //對信號進行改造,改"石"成"金"
  siganl = [siganl map:^id(NSString *value) {
      if ([value isEqualToString:@"石"]) {
          return @"金";
      }
      return value;
    
  }];

  //打印,不論信號發(fā)送的是什么,這一步都會走的
  [siganl subscribeNext:^(id x) {
      NSLog(@"%@",x);
    
  }];


}

11.過濾,未滿18歲,禁止入內(nèi)

- (void)demo11{
  RACSignal *singal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
   
      [subscriber sendNext:@(15)];
      [subscriber sendNext:@(17)];
      [subscriber sendNext:@(21)];
      [subscriber sendNext:@(14)];
      [subscriber sendNext:@(30)];
    
      [subscriber sendCompleted];
    
      return nil;
  }];

  //過濾信號,打印
  [[singal filter:^BOOL(NSNumber *value) {
    
      //大于18歲的,才可以通過
      return value.integerValue >= 18;//return為yes可以通過
  }] subscribeNext:^(id x) {
      NSLog(@"%@",x);
    
  }];

}

12.秩序(flattenMap方法也可以換成then方法,效果一樣)

-(void)demo12{

  RACSignal *siganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
      NSLog(@"打蛋液");
      [subscriber sendNext:@"蛋液"];
      [subscriber sendCompleted];
      return nil;
    
  }];

  //對信號進行秩序秩序的第一步
  siganl = [siganl flattenMap:^RACStream *(NSString *value) {
     //處理上一步的RACSiganl的信號value.這里的value=@"蛋液"
      NSLog(@"把%@倒進鍋里面煎",value);
      return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
          [subscriber sendNext:@"煎蛋"];
          [subscriber sendCompleted];
          return nil;
        
      }];
    
   }];
  //對信號進行第二步處理
  siganl = [siganl flattenMap:^RACStream *(id value) {
      NSLog(@"把%@裝載盤里",value);
      return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
          [subscriber sendNext:@"上菜"];
          [subscriber sendCompleted];
          return nil;
      }];
    
  }];

 //最后打印 最后帶有===上菜
  [siganl subscribeNext:^(id x) {
      NSLog(@"====%@",x);
  }];

}

13.命令

-(void)demo13{

  RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
      //打忧:今天我投降了

     //命令執(zhí)行代理
      NSLog(@"%@我投降了",input);
      //返回一個RACSignal信號
      return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
          return nil;
      }];
    
  }];

  //執(zhí)行命令
  [command execute:@"今天"];


}

14.延遲

- (void)demo14{
  RACSignal *siganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
      NSLog(@"等等我,我還有10s就到了");
      [subscriber sendNext:@"北極"];
      [subscriber sendCompleted];
      return nil;
  }];

  //延遲10s接受next的玻璃球
  [[siganl delay:10] subscribeNext:^(id x) {
   
     NSLog(@"我到了%@",x);
    
  }];


}

15.重放

- (void)demo15{

  RACSignal *siganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
      NSLog(@"電影");
      [subscriber sendNext:@"電影"];
      [subscriber sendCompleted];
      return nil;
    
  }];

  //創(chuàng)建該普通信號的重復(fù)信號
  RACSignal *replaySiganl = [siganl replay];
  //重復(fù)接受信號
  [replaySiganl subscribeNext:^(NSString *x) {
      NSLog(@"小米%@",x);
  }];
  [replaySiganl subscribeNext:^(NSString *x) {
      NSLog(@"小紅%@",x);
    
  }];
}

16.定時---每隔8小時服用一次藥

- (void)demo16{
  //創(chuàng)建定時器信號.定時8小時
  RACSignal *siganl = [RACSignal interval:60 * 60 * 8 onScheduler:[RACScheduler mainThreadScheduler]];
  //定時器執(zhí)行代碼
 [siganl subscribeNext:^(id x) {
      NSLog(@"吃藥");
    
  }];


}

17.超時

- (void)demo17{

 RACSignal *siganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
      NSLog(@"我快到了");
      RACSignal *sendSiganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
       
          [subscriber sendNext:nil];
          [subscriber sendCompleted];
          return nil;
      }];
    
      //發(fā)生信號要1個小時10分鐘才到
      [[sendSiganl delay:60 * 70] subscribeNext:^(id x) {
         //這里才發(fā)送next玻璃球到siganl
          [subscriber sendNext:@"我到了"];
          [subscriber sendCompleted];
        
      }];
      return nil;
    
    
  }];

  [[siganl timeout:60 * 60 onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(id x) {
   
      NSLog(@"等了你一個小時,你一直沒來,我走了");
    
  }];

}

18.重試

- (void)demo18{

  __block int failedCount = 0;

  //創(chuàng)建信號
  RACSignal *siganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
      if (failedCount < 100) {
          failedCount ++;
          NSLog(@"我失敗了");
          [subscriber sendError:nil];
      }else{
          NSLog(@"經(jīng)歷了數(shù)百次后,我成功了");
          [subscriber sendNext:nil];

      }
      return nil;
    
  }];

  //重試
  RACSignal *retrySiganl = [siganl retry];
  //直到發(fā)生next的玻璃球
  [retrySiganl subscribeNext:^(id x) {
      NSLog(@"重要成功了");
    
  }];

}

19.節(jié)流,不好意思,這里每一秒只能通過一個人,如果1s內(nèi)發(fā)生多個,只通過最后一個

- (void)demo19{

  RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
     //即使發(fā)送一個next的玻璃球
      [subscriber sendNext:@"A"];
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
          [subscriber sendNext:@"B"];
        
      });
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
          [subscriber sendNext:@"C"];
          [subscriber sendNext:@"D"];
          [subscriber sendNext:@"E"];
         
     });
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
          [subscriber sendNext:@"F"];
      });
      return nil;
    
  }];

  //對信號進行節(jié)流,限制時間內(nèi)一次只能通過一個玻璃球
  [[signal throttle:1] subscribeNext:^(id x) {
      NSLog(@"%@通過了",x);
    
  }];
  /*
   [2015-08-16 22:08:45.677]旅客A
   [2015-08-16 22:08:46.737]旅客B
   [2015-08-16 22:08:47.822]旅客E
   [2015-08-16 22:08:48.920]旅客F
   */

}

20.條件(takeUntil方法,當給定的signal完成前一直取值)

- (void)demo20{

  RACSignal *takeSiganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
     //創(chuàng)建一個定時器信號,每一秒觸發(fā)一次
      RACSignal *siganl = [RACSignal interval:1 onScheduler:[RACScheduler mainThreadScheduler]];
      [siganl subscribeNext:^(id x) {
         //在這里定時發(fā)送next玻璃球
          [subscriber sendNext:@"直到世界盡頭"];
        
      }];
      return nil;

  }];

  //創(chuàng)建條件信號
  RACSignal *conditionSiganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
     //設(shè)置5s后發(fā)生complete玻璃球
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
          NSLog(@"世界的今天到了,請下車");
          [subscriber sendCompleted];
      });
      return nil;
  }];

  //設(shè)置條件,takeSiganl信號在conditionSignal信號接收完成前,不斷取值
  [[takeSiganl takeUntil:conditionSiganl] subscribeNext:^(id x) {
      NSLog(@"%@",x);
    
  }];


}

21.RACReplaySubject使用

/**
 *  RACReplaySubject創(chuàng)建方法
    1.創(chuàng)建RACSubject
    2.訂閱信號
    3.發(fā)送信號
 工作流程:
   1.訂閱信號,內(nèi)部保存了訂閱者,和訂閱者相應(yīng)的block
   2.當發(fā)送信號的,遍歷訂閱者,調(diào)用訂閱者的nextBlock
   3.發(fā)送的信號會保存起來,當訂閱者訂閱信號的時候,會將之前保存的信號,一個個作用于新的訂閱者,保存信號的容量由capacity決定,這也是有別于RACSubject的
 */

-(void)RACReplaySubject{

  RACReplaySubject *replaySubject = [RACReplaySubject subject];
  [replaySubject subscribeNext:^(id x) {
      NSLog(@" 1 %@",x);
  }];

  [replaySubject subscribeNext:^(id x) {
      NSLog(@"2 %@",x);
  }];
  [replaySubject sendNext:@7];
  [replaySubject subscribeNext:^(id x) {
      NSLog(@"3 %@",x);
  }];

}

22.rac_liftSelector:withSignals使用

//這里的rac_liftSelector:withSignals 就是干這件事的运褪,它的意思是當signalA和signalB都至少sendNext過一次,接下來只要其中任意一個signal有了新的內(nèi)容玖瘸,doA:withB這個方法就會自動被觸發(fā)

-(void)test{

  RACSignal *sigalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
   
      double delayInSeconds = 2.0;
      dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds *NSEC_PER_SEC));
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(popTime * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
          [subscriber sendNext:@"A"];
        
      });
      return nil;
  }];

  RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
      [subscriber sendNext:@"B"];
      [subscriber sendNext:@"Another B"];
      [subscriber sendCompleted];
      return nil;
    
  }];
  [self rac_liftSelector:@selector(doA:withB:) withSignals:sigalA,signalB, nil];

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市檀咙,隨后出現(xiàn)的幾起案子雅倒,更是在濱河造成了極大的恐慌,老刑警劉巖弧可,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔑匣,死亡現(xiàn)場離奇詭異,居然都是意外死亡棕诵,警方通過查閱死者的電腦和手機裁良,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來校套,“玉大人价脾,你說我怎么就攤上這事〉殉祝” “怎么了侨把?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長妹孙。 經(jīng)常有香客問我秋柄,道長,這世上最難降的妖魔是什么蠢正? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任骇笔,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘笨触。我一直安慰自己懦傍,他們只是感情好,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布旭旭。 她就那樣靜靜地躺著谎脯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪持寄。 梳的紋絲不亂的頭發(fā)上源梭,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機與錄音稍味,去河邊找鬼废麻。 笑死,一個胖子當著我的面吹牛模庐,可吹牛的內(nèi)容都是我干的烛愧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼掂碱,長吁一口氣:“原來是場噩夢啊……” “哼怜姿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起疼燥,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤沧卢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后醉者,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體但狭,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年撬即,在試婚紗的時候發(fā)現(xiàn)自己被綠了立磁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡剥槐,死狀恐怖唱歧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情粒竖,我是刑警寧澤迈喉,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站温圆,受9級特大地震影響挨摸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜岁歉,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一得运、第九天 我趴在偏房一處隱蔽的房頂上張望膝蜈。 院中可真熱鬧,春花似錦熔掺、人聲如沸饱搏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽推沸。三九已至,卻和暖如春券坞,著一層夾襖步出監(jiān)牢的瞬間鬓催,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工恨锚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宇驾,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓猴伶,卻偏偏與公主長得像课舍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子他挎,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容

  • RAC在iOS的實際開發(fā)中確實是一件有力的武器筝尾,此文將從以下幾方面講解 RACSignal RACSubject ...
    4b5cb36a2ee2閱讀 904評論 0 0
  • 一、RAC簡介 ReactiveCocoa(簡稱為RAC),是由Github開源的一個應(yīng)用于iOS和OS開發(fā)的新框...
    yahoouchen閱讀 5,897評論 0 21
  • 新項目今天提測,項目中用到了RAC&MVVM框架,簡單記錄下RAC的簡單使用 項目是OC開發(fā),用的是Reactiv...
    星辰流轉(zhuǎn)輪回閱讀 498評論 0 1
  • 標簽: iOS RAC 概述 ReactiveCocoa是一個函數(shù)響應(yīng)式編程框架办桨,它能讓我們脫離Cocoa AP...
    GodyZ閱讀 7,534評論 16 97
  • 轉(zhuǎn)載自http://www.reibang.com/p/a4fefb434652一筹淫、常見類1、RACSiganl ...
    君莫嘆人生如若初見閱讀 1,423評論 0 18