參考資料:
常見用法
1. rac_signalForControlEvents監聽事件,替換addTarget監聽
[[self.myButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
@strongify(self);
//改變屬性 觸發KVO
self.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_liftSelector
RACSignal *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
[[[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"執行sendNext"];
NSLog(@"執行sendNext");
[subscriber sendCompleted];
return nil;
}] doNext:^(id x) {
NSLog(@"執行doNext");
}] doCompleted:^{
NSLog(@"執行doCompleted");
}] subscribeNext:^(id x) {
NSLog(@"執行subscribeNext");
}];
// 輸出
// 執行doNext
// 執行subscribeNext
// 執行sendNext
// 執行doCompleted
複製程式碼