1. 監(jiān)聽 KVO
- 1.1> 監(jiān)聽對象的屬性變化
[RACObserve(self.scrollView, contentSize) subscribeNext:^(id x) {
}];
- 1.2> 監(jiān)聽Bool值改變
[RACObserve(self, bCheck) subscribeNext:^(id x) {
}];
- 1.3> 監(jiān)聽方法
監(jiān)聽某個方法被調(diào)用會觸發(fā)
[[self rac_signalForSelector:@selector(viewDidAppear:)] subscribeNext:^(id x) {
}];
可以指定某個代理中的方法
[[self rac_signalForSelector:@selector(alertView:clickedButtonAtIndex:) fromProtocol:@protocol(UIAlertViewDelegate)] subscribeNext:^(RACTuple *tuple) {
}];
監(jiān)聽UITextField變化
[textField.rac_textSignal subscribeNext:^(NSString *text) {
//文本輸入變化
}];
[[textField rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(id x) {
//文本輸入變化
}];
[[textField rac_signalForControlEvents:UIControlEventEditingDidEnd] subscribeNext:^(id x) {
//結(jié)束編輯
}];
RACObserve監(jiān)聽的對象屬性返回值作為RAC監(jiān)聽對象屬性的值
RAC(customBtn, hidden) = RACObserve(textField, hidden);
等價于:
[RACObserve(textField, hidden) subscribeNext:^(BOOL x) {
customBtn.hidden = x;
}]
2.事件
- 2.1> 按鈕點擊事件
[[submitBtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
}];
- 2.2> 手勢事件
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
[[cancelTap rac_gestureSignal] subscribeNext:^(id x) {
}];
3.通知
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"postData" object:nil] subscribeNext:^(NSNotification *notification) {
}];
4.替代代理 回調(diào)類似于block用法
信號創(chuàng)建
RACSubject * moreSignal = [RACSubject subject];
信號發(fā)送
[moreSignal sendNext:];
信號響應(yīng)
[moreSignal subscribeNext:^(id x) {
}];
5.映射
map函數(shù)就是創(chuàng)建一個訂閱者的映射并且返回數(shù)據(jù)屈雄,RAC監(jiān)聽對象屬性的值徘郭,也就是customLabel.text根據(jù)textField的值來賦值社付,value的類型根據(jù)target監(jiān)聽屬性值來定義
eg:textField的text是NSString類型. map函數(shù)需要返回值慨菱,類型必須和等號左邊的RAC的接受值一致挟炬,如果返回BOOL則crash
RAC(customLabel, text) = [textField.rac_textSignal map:^id(NSString *value) {
return value;
}];
[[textFild.rac_textSignal map:^id(id value) {
return @1;
}] subscribeNext:^(id x) {
NSLog(@"%@", x); //輸出1鸥滨,這個x是上面block中return返回值1
}];
6.過濾
- 6.1> filter 可以幫助你篩選出你需要的值
[[self.textFild.rac_textSignal filter:^BOOL(NSString *value) {
return [value length] > 3;
}] subscribeNext:^(id x) {
NSLog(@"x = %@", x);
}];
- 6.2> ignore 可以忽略某些值
[[self.textFild.rac_textSignal filter:^BOOL(NSString *value) {
return [value length] > 3;
}] subscribeNext:^(id x) {
NSLog(@"x = %@", x);
}];
- 6.3> take 從開始一共取幾次信號. 從頭
RACSubject * subject = [RACSubject subject];
[[subject take:2] subscribeNext:^(id x) {
NSLog(@"%@",x); // 1 2
}];
[subject sendNext:@"1"];
[subject sendNext:@"2"];
[subject sendNext:@"3"];
- 6.4> takeLast 取后面的值 必須是發(fā)送完成
RACSubject * subject = [RACSubject subject];
[[subject takeLast:2] subscribeNext:^(id x) {
NSLog(@"%@",x); // 2 3
}];
[subject sendNext:@"1"];
[subject sendNext:@"2"];
[subject sendNext:@"3"];
[subject sendCompleted];
- 6.5> takeUntil 當(dāng)傳入的某個信號發(fā)送完成嗦哆,這樣就不會再接收源信號的內(nèi)容,或者發(fā)送任意數(shù)據(jù)也不會再接收
RACSubject * subject = [RACSubject subject];
RACSubject * signal = [RACSubject subject];
[[subject takeUntil:signal] subscribeNext:^(id x) {
NSLog(@"%@",x); //1 2
}];
[subject sendNext:@"1"];
[subject sendNext:@"2"];
[signal sendCompleted];
[subject sendNext:@"3"];
- 6.6> distinctUntilChanged 如果當(dāng)前的值跟上一個值相同婿滓,這樣就不會被訂閱發(fā)送信號
RACSubject * subject = [RACSubject subject];
[[subject distinctUntilChanged] subscribeNext:^(id x) {
NSLog(@"%@",x); //A
}];
[subject sendNext:@"A"];
[subject sendNext:@"A"];
7.RACMulticastConnection
當(dāng)我們多次訂閱同一個信號的時候老速,避免訂閱信號block中的代碼被調(diào)用多次。
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id subscriber) {
return nil;
}];
RACMulticastConnection *connection = [signal publish];//轉(zhuǎn)化為連接類
[connection.signal subscribeNext:^(id x) {
}];
[connection.signal subscribeNext:^(id x) {
}];
[connection connect];
8.rac_liftSelector:withSignalsFromArray:
當(dāng)進(jìn)入一個頁面需要發(fā)多次請求凸主,當(dāng)全部請求結(jié)束再執(zhí)行更新UI橘券,可以使用下面RAC方法,可以替代多線程GCD的dispatch_group_enter和dispatch_group_leave 參數(shù)1:請求結(jié)束執(zhí)行的方法秕铛,參數(shù)個數(shù)必須是和參數(shù)二的數(shù)組信號個數(shù)一致约郁,是信號發(fā)送的值 參數(shù)2: 數(shù)組 存放所有信號
rac_liftSelector:withSignalsFromArray:
9.組合
- 9.1> concat 數(shù)組組合
RACSequence *letters = [@"A B C D E F G H I" componentsSeparatedByString:@" "].rac_sequence;
RACSequence *numbers = [@"1 2 3 4 5 6 7 8 9" componentsSeparatedByString:@" "].rac_sequence;
RACSequence *concatenated = [letters concat:numbers];
[concatenated.signal subscribeNext:^(id x) {
NSLog(@"%@",x); // Contains: A B C D E F G H I 1 2 3 4 5 6 7 8 9
}];
- 9.2> merge 當(dāng)多個信號執(zhí)行同一種操作 使用merge
RACSubject *subject1 = [RACSubject subject];
RACSubject *subject2 = [RACSubject subject];
RACSignal *mergeSignal = [subject1 merge:subject2];
[mergeSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[subject1 sendNext:@"第一個位置調(diào)用"];
[subject1 sendNext:@"第二個位置調(diào)用"];
- 9.3> zipWith 當(dāng)希望兩個信號都發(fā)出信號時才調(diào)用,并且會把兩個信號的內(nèi)容組成一個元組但两,和第8的作用非常一樣
RACSubject *subject1 = [RACSubject subject];
RACSubject *subject2 = [RACSubject subject];
RACSignal *mergeSignal = [subject1 zipWith:subject2];
[mergeSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
[subject1 sendNext:@"第一個位置調(diào)用"];
[subject1 sendNext:@"第二個位置調(diào)用"];
- 9.4> combineLatest 將多個信號合并起來鬓梅,當(dāng)希望兩個信號都發(fā)出信號時才調(diào)用,和9.3作用一樣
RACSubject *subject1 = [RACSubject subject];
RACSubject *subject2 = [RACSubject subject];
RACSignal *mergeSignal = [RACSignal combineLatest:@[subject1,subject2] reduce:^id(NSString * title1,NSString * title2){
NSLog(@"%@ -- %@",title1,title2); //第一個位置調(diào)用 -- 第二個位置調(diào)用
return @"返回值";
}];
[mergeSignal subscribeNext:^(id x) {
NSLog(@"%@",x); //返回值
}];
[subject1 sendNext:@"第一個位置調(diào)用"];
[subject2 sendNext:@"第二個位置調(diào)用"];
- 9.5> reduce reduce是聚合的作用谨湘,講多個信號分別發(fā)送的信號聚在一起返回绽快。