參考資料:
- ReactiveCocoa源碼(OC版) https://github.com/ReactiveCocoa/ReactiveObjC
Swift, please see ReactiveCocoa or ReactiveSwift
常見用法
1:rac_signalForControlEvents監(jiān)聽事件但指,替換addTarget監(jiān)聽
[[self.myButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
@strongify(self);
//改變屬性 觸發(fā)KVO
self.userModel.userName=@"cnblogs";
//發(fā)送通知 觸發(fā)通知監(jiān)聽
[[NSNotificationCenter defaultCenter] postNotificationName:MPTNotificationName object:nil];
NSLog(@"rac_signalForControlEvents監(jiān)聽事件 - ");
}];
```
2:rac_textSignal 監(jiān)聽文本框的文字改變
[[self.myTextField rac_textSignal] subscribeNext:^(id x) {
NSLog(@"rac_textSignal當(dāng)前輸入:%@",x);
}];
//distinctUntilChanged 相同就不會(huì)再響應(yīng) takeUntil:(RACSignal *):獲取信號(hào)直到某個(gè)信號(hào)執(zhí)行完成
[[[[self.myTextField rac_textSignal] distinctUntilChanged] takeUntil:self.rac_willDeallocSignal] subscribeNext:^(id x) {
NSLog(@"rac_textSignal-distinctUntilChanged當(dāng)前輸入:%@",x);
}];
```
3:rac_valuesAndChangesForKeyPath KVO監(jiān)聽
[[self.userModel rac_valuesAndChangesForKeyPath:@"userName"
options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^(id x) {
NSLog(@"userName now value:%@",x[0]);
}];
```
4:監(jiān)聽通知
[[[[NSNotificationCenter defaultCenter] rac_addObserverForName:MPTNotificationName object:nil] takeUntil:self.rac_willDeallocSignal] subscribeNext:^(id x) {
NSLog(@"收到通知了");
}];
```
5:替換代理方法的實(shí)現(xiàn) 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當(dāng)前對(duì)象
//tuple.second索引值
}];
[alertView show];
// [[self rac_signalForSelector:@selector(alertView:clickedButtonAtIndex:)] subscribeNext:^(id x) {
//
// }];
//UIAlertView 還有更簡便的 上面只是為了演示rac_signalForSelector 下面的X就是索引值
//如果使用此方法rac_signalForSelector 不會(huì)再執(zhí)行了医吊。因?yàn)閞ac_buttonClickedSignal內(nèi)部已經(jīng)訂閱了rac_signalForSelector方法
[[alertView rac_buttonClickedSignal] subscribeNext:^(id x) {
NSLog(@"index %@",x);
}];
```
6.處理多個(gè)請(qǐng)求试疙,都返回結(jié)果的時(shí)候,統(tǒng)一做處理.
rac_liftSelector
RACSignal *request1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// 發(fā)送請(qǐng)求1
[subscriber sendNext:@"發(fā)送請(qǐng)求1"];
return nil;
}];
RACSignal *request2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// 發(fā)送請(qǐng)求2
[subscriber sendNext:@"發(fā)送請(qǐng)求2"];
return nil;
}];
// 使用注意:幾個(gè)信號(hào)舶胀,參數(shù)一的方法就幾個(gè)參數(shù),每個(gè)參數(shù)對(duì)應(yīng)信號(hào)發(fā)出的數(shù)據(jù)碧注。
[self rac_liftSelector:@selector(updateUIWithR1:r2:) withSignalsFromArray:@[request1,request2]];
更新UI
- (void)updateUIWithR1:(id)data r2:(id)data1
{
NSLog(@"更新UI%@ %@",data,data1);
}
隊(duì)列
//then用法
//用于連接兩個(gè)信號(hào)嚣伐,當(dāng)?shù)谝粋€(gè)信號(hào)完成,才會(huì)連接then返回的信號(hào)
RACSignal *thenSignal=[aSignal then:^RACSignal *{
return bSignal;
}];
[thenSignal subscribeNext:^(id x) {
NSLog(@"thenSignal的值:%@",x);
}];
//輸出 thenSignal的值:7 thenSignal的值:9 bSignal清理了 aSignal清理了
//then實(shí)例
[[[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
NSLog(@"第一步");
[subscriber sendCompleted];//向訂閱者發(fā)送完成信號(hào)萍丐,否者一直處于執(zhí)行中
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的用法要跟上面這樣使用轩端,它會(huì)在RACSignal里面就執(zhí)行
- doNext doCompleted執(zhí)行時(shí)間 doNext: 執(zhí)行Next之前,會(huì)先執(zhí)行這個(gè)Block doCompleted: 執(zhí)行sendCompleted之前逝变,會(huì)先執(zhí)行這個(gè)Block
[[[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"執(zhí)行sendNext"];
NSLog(@"執(zhí)行sendNext");
[subscriber sendCompleted];
return nil;
}] doNext:^(id x) {
NSLog(@"執(zhí)行doNext");
}] doCompleted:^{
NSLog(@"執(zhí)行doCompleted");
}] subscribeNext:^(id x) {
NSLog(@"執(zhí)行subscribeNext");
}];
// 輸出
// 執(zhí)行doNext
// 執(zhí)行subscribeNext
// 執(zhí)行sendNext
// 執(zhí)行doCompleted