ReactiveCocoa个人记录
生活随笔
收集整理的這篇文章主要介紹了
ReactiveCocoa个人记录
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
參考資料:
-
ReactiveCocoa源碼(OC版)
-
Swift 版?or?ReactiveSwift
-
MVVMReactiveCocoaDemo介紹
常見用法
1. rac_signalForControlEvents監聽事件,替換addTarget監聽
[[self.myButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {@strongify(self);//改變屬性 觸發KVOself.userModel.userName=@"cnblogs";//發送通知 觸發通知監聽[[NSNotificationCenter defaultCenter] postNotificationName:MPTNotificationName object:nil];NSLog(@"rac_signalForControlEvents監聽事件 - ");}]; 復制代碼2. rac_textSignal 監聽文本框的文字改變
[[self.myTextField rac_textSignal] subscribeNext:^(id x) {NSLog(@"rac_textSignal當前輸入:%@",x);}];//distinctUntilChanged 相同就不會再響應 takeUntil:(RACSignal *):獲取信號直到某個信號執行完成[[[[self.myTextField rac_textSignal] distinctUntilChanged] takeUntil:self.rac_willDeallocSignal] subscribeNext:^(id x) {NSLog(@"rac_textSignal-distinctUntilChanged當前輸入:%@",x);}]; 復制代碼3. rac_valuesAndChangesForKeyPath KVO監聽
[[self.userModel rac_valuesAndChangesForKeyPath:@"userName" options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^(id x) {NSLog(@"userName now value:%@",x[0]);}]; 復制代碼4. 監聽通知
[[[[NSNotificationCenter defaultCenter] rac_addObserverForName:MPTNotificationName object:nil] takeUntil:self.rac_willDeallocSignal] subscribeNext:^(id x) {NSLog(@"收到通知了");}]; 復制代碼5. 替換代理方法的實現 rac_signalForSelector
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"RAC" message:@"RAC TEST" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"other", nil];[[self rac_signalForSelector:@selector(alertView:clickedButtonAtIndex:) fromProtocol:@protocol(UIAlertViewDelegate)] subscribeNext:^(RACTuple *tuple) {NSLog(@"tuple.first:%@",tuple.first);NSLog(@"tuple.second:%@",tuple.second);NSLog(@"tuple.third:%@",tuple.third);//tuple.first UIAlertView當前對象//tuple.second索引值}];[alertView show];// [[self rac_signalForSelector:@selector(alertView:clickedButtonAtIndex:)] subscribeNext:^(id x) { // // }];//UIAlertView 還有更簡便的 上面只是為了演示rac_signalForSelector 下面的X就是索引值//如果使用此方法rac_signalForSelector 不會再執行了。因為rac_buttonClickedSignal內部已經訂閱了rac_signalForSelector方法[[alertView rac_buttonClickedSignal] subscribeNext:^(id x) {NSLog(@"index %@",x);}]; 復制代碼6. 處理多個請求,都返回結果的時候,統一做處理.
rac_liftSelectorRACSignal *request1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {// 發送請求1[subscriber sendNext:@"發送請求1"];return nil;}];RACSignal *request2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {// 發送請求2[subscriber sendNext:@"發送請求2"];return nil;}];// 使用注意:幾個信號,參數一的方法就幾個參數,每個參數對應信號發出的數據。[self rac_liftSelector:@selector(updateUIWithR1:r2:) withSignalsFromArray:@[request1,request2]];復制代碼更新UI
- (void)updateUIWithR1:(id)data r2:(id)data1 {NSLog(@"更新UI%@ %@",data,data1); } 復制代碼隊列
//then用法//用于連接兩個信號,當第一個信號完成,才會連接then返回的信號RACSignal *thenSignal=[aSignal then:^RACSignal *{return bSignal;}];[thenSignal subscribeNext:^(id x) {NSLog(@"thenSignal的值:%@",x);}];//輸出 thenSignal的值:7 thenSignal的值:9 bSignal清理了 aSignal清理了//then實例[[[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {NSLog(@"第一步");[subscriber sendCompleted];//向訂閱者發送完成信號,否者一直處于執行中return nil;}] then:^RACSignal *{return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {NSLog(@"第二步");[subscriber sendCompleted];return nil;}];}] then:^RACSignal *{return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {NSLog(@"第三步");[subscriber sendCompleted];return nil;}];}] subscribeCompleted:^{NSLog(@"完成");}];//輸出:第一步 第二步 第三步//說明:then的用法要跟上面這樣使用,它會在RACSignal里面就執行 復制代碼- doNext doCompleted執行時間 doNext: 執行Next之前,會先執行這個Block doCompleted: 執行sendCompleted之前,會先執行這個Block
總結
以上是生活随笔為你收集整理的ReactiveCocoa个人记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Compiling Swift sou
- 下一篇: 018对象——对象 get_class