經過ReactiveCocoa(一)的學習,相信你們對ReactiveCocoa有了一些基本認識吧。下面就讓咱們來學習ReactiveCocoa的一些基本使用吧!html
在ReactiveCocoa(一)中講到能夠經過RACSubject
代替代理,咱們也能夠經過rac_signalForSelector
一樣代替代理。react
// 需求:自定義redView,監聽紅色view中按鈕點擊 // 以前都是須要經過代理監聽,給紅色View添加一個代理屬性,點擊按鈕的時候,通知代理作事情 // rac_signalForSelector:把調用某個對象的方法的信息轉換成信號,就要調用這個方法,就會發送信號。 // 這裏表示只要redV調用btnClick:,就會發出信號,訂閱就行了。 [[redV rac_signalForSelector:@selector(btnClick:)] subscribeNext:^(id x) { NSLog(@"點擊紅色按鈕"); }];
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); }
用於給某個對象的某個屬性綁定。htm
// 只要文本框文字改變,就會修改label的文字 RAC(self.labelView,text) = _textField.rac_textSignal;
監聽某個對象的某個屬性,返回的是信號對象
[RACObserve(self, age) subscribeNext:^(id x) { NSLog(@"%@",x); }];
通常都是成對出現,爲了不引發循環引用致使內存泄漏的,和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]; }];
把數據包裝成RACTuple(元組類)
// 把參數中的數據包裝成元組 RACTuple *tuple = RACTuplePack(@"Scott_Mr",@20);
把RACTuple(元組類)解包成對應的數據。
// 解包元組,會把元組的值,按順序給參數裏面的變量賦值 // name = @"Scott_Mr" age = @20 RACTupleUnpack(NSString *name,NSNumber *age) = tuple; NSLog(@"%@,%@",name,age);
個人博客即將搬運同步至騰訊雲+社區,邀請你們一同入駐:https://cloud.tencent.com/developer/support-plan