ReactiveCocoa(二)

前言

經過ReactiveCocoa(一)的學習,相信你們對ReactiveCocoa有了一些基本認識吧。下面就讓咱們來學習ReactiveCocoa的一些基本使用吧!html

ReactiveCocoa基本使用

代替代理

在ReactiveCocoa(一)中講到能夠經過RACSubject代替代理,咱們也能夠經過rac_signalForSelector一樣代替代理。react

代碼演練
// 需求:自定義redView,監聽紅色view中按鈕點擊
// 以前都是須要經過代理監聽,給紅色View添加一個代理屬性,點擊按鈕的時候,通知代理作事情
// rac_signalForSelector:把調用某個對象的方法的信息轉換成信號,就要調用這個方法,就會發送信號。
// 這裏表示只要redV調用btnClick:,就會發出信號,訂閱就行了。
[[redV rac_signalForSelector:@selector(btnClick:)] subscribeNext:^(id x) {
    NSLog(@"點擊紅色按鈕");
}];

代替KVO

rac_valuesAndChangesForKeyPath:用於監聽某個對象的某個屬性發生變化。數組

代碼演練
// 需求:每點擊一次,年齡增長一次
// 定義一個age屬性
- (void)obserVer {
    [[self rac_valuesForKeyPath:@"age" observer:nil] subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    self.age ++;
}

監聽事件

rac_signalForControlEvents:用於監聽某個事件。ide

代碼演練
// 把按鈕點擊事件轉化成信號,點擊按鈕,就會發送信號
[[self.btn rac_signalForControlEvents:UIControlEventTouchUpInside]      subscribeNext:^(id x) {
        NSLog(@"監聽按鈕點擊事件");
 }];

代替通知

rac_addObserverForName:用於監聽某個通知。學習

代碼演練
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) {
    NSLog(@"彈出鍵盤");
}];

監聽文本框文字改變

rac_textSignal:用於監聽文本框文字發生改變代理

代碼演練
[[self.textField rac_textSignal] subscribeNext:^(id x) {
    NSLog(@"text:%@",x);
}];

處理當界面有多個請求時,須要都獲取到數據,才能展現界面

rac_liftSelector:withSignalsFromArray:Signals:當傳入的Signals(信號數組),每個signal都至少sendNext過一次,就會去觸發selector參數的方法。code

注意:幾個信號,參數一的方法就幾個參數,每一個參數對應信號發出的數據,不然運行時會報錯。server

代碼演練
- (void)test{
    // 建立信號A
    RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            NSLog(@"數據請求1");
            [subscriber sendNext:@"發送請求1回來的數據"];
            return [RACDisposable disposableWithBlock:^{
                NSLog(@"隨便寫寫");
            }];
        }];
    
    // 建立信號B
    RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        NSLog(@"數據請求2");
        [subscriber sendNext:@"發送請求2回來的數據"];
        return nil;
    }];
    
    // RAC:就能夠判斷兩個信號有沒有都發出內容
    // SignalsFromArray:監聽哪些信號的發出
    // 當signals數組中的全部信號都發送sendNext就會觸發方法調用者(self)的selector
    // 注意:selector方法的參數不能亂寫,有幾個信號就對應幾個參數
    // 不須要主動訂閱signalA,signalB,方法內部會自動訂閱
    [self rac_liftSelector:@selector(doneNextWithA:andB:) withSignalsFromArray:@[signalA,signalB]];
}

- (void)doneNextWithA:(NSString *)a andB:(NSString *)b {
     NSLog(@"請求完成,更新UI--a:%@,b:%@",a,b);
}

ReactiveCocoa常見宏

RAC(TARGET, ...)

  • 用於給某個對象的某個屬性綁定。htm

    // 只要文本框文字改變,就會修改label的文字
      RAC(self.labelView,text) = _textField.rac_textSignal;

RACObserve(TARGET,KEYPATH)

  • 監聽某個對象的某個屬性,返回的是信號對象

    [RACObserve(self, age) subscribeNext:^(id x) {
          NSLog(@"%@",x);
      }];

@weakify(Obj)和@strongify(Obj)

  • 通常都是成對出現,爲了不引發循環引用致使內存泄漏的,和block的使用相似。

    @weakify(self);
      [[_redView rac_signalForSelector:@selector(btnClick:)] subscribeNext:^(id x) {
      @strongify(self);
      NavViewController *navVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:NSStringFromClass([NavViewController class])];
      [self.navigationController pushViewController:navVC animated:YES];
      }];

RACTuplePack

  • 把數據包裝成RACTuple(元組類)

    // 把參數中的數據包裝成元組
    RACTuple *tuple = RACTuplePack(@"Scott_Mr",@20);

RACTupleUnpack

  • 把RACTuple(元組類)解包成對應的數據。

    // 解包元組,會把元組的值,按順序給參數裏面的變量賦值
    // name = @"Scott_Mr" age = @20
    RACTupleUnpack(NSString *name,NSNumber *age) = tuple;
    NSLog(@"%@,%@",name,age);

聲明

個人博客即將搬運同步至騰訊雲+社區,邀請你們一同入駐:https://cloud.tencent.com/developer/support-plan

相關文章
相關標籤/搜索