一.ReactiveCocoa常見類
1.RACSignal:信號類,一般表示將來有數(shù)據(jù)傳遞,只要有數(shù)據(jù)改變,信號內(nèi)部接收到數(shù)據(jù)就會馬上發(fā)出數(shù)據(jù)。它本身不具備發(fā)送信號的能力,而是交給內(nèi)部一個訂閱者去發(fā)出。默認為冷信號,也就是值改變了并不會觸發(fā),只有訂閱了這個信號,這個信號才會變?yōu)闊嵝盘?,值改變了才會觸發(fā)。
RACSignal使用方法:
//1.創(chuàng)建信號
RACSignal*signal = [RACSignal createSignal:^RACDisposable*_Nullable(id_Nonnullsubscriber) {
//3.發(fā)送信號(signal本身不具備發(fā)送信號的能力,而是交給其內(nèi)部的訂閱者發(fā)出。)
[subscriber sendNext:@"123"];
return nil;
}];
//2.訂閱信號,激活信號.
[signal subscribeNext:^(id_Nullablex) {
NSLog(@"%@",x);//打印結(jié)果為123
}];
2.RACSubscriber:表示訂閱者的意思,用于發(fā)送信號,這是一個協(xié)議,只要遵守這個協(xié)議并實現(xiàn)其方案就能成為訂閱者。
3.RACSubject:信號提供者,既可以充當信號,又能發(fā)送信號。通常用于代替代理。
4.RACReplaySubject:RACSubject子類。RACReplaySubject可以先發(fā)送信號再訂閱,RACSubject不可以
//1.創(chuàng)建信號
RACSubject*subject = [RACSubject subject];
//2.訂閱信號,激活信號.
[subject subscribeNext:^(id_Nullablex) {
NSLog(@"%@",x);
}];
//3.發(fā)送信號
[subject sendNext:@"123”];
RACReplaySubject*replaySubject = [RACReplaySubject subject];
[replaySubject sendNext:@"123"];
[replaySubject subscribeNext:^(id_Nullablex) {
NSLog(@"%@",x);
}];
5.RACTuple:元組
6.RACSequence:RAC集合類,可以用于快速遍歷。
//數(shù)組遍歷
NSArray*array =@[@1,@2,@3];
[array.rac_sequence.signal subscribeNext:^(id_Nullablex) {
NSLog(@"%@",x);
}];
//字典遍歷
NSDictionary*dictionary =@{@"name":@"tony",@"age":@22};
[dictionary.rac_sequence.signal subscribeNext:^(id_Nullablex) {
//??? NSLog(@"%@",x); // x類型為元組RACTuple
RACTupleUnpack(NSString *key,NSString *value) = x;
NSLog(@"key=%@",key);
NSLog(@"value=%@",value);
}];
//高階字典轉(zhuǎn)模型
NSArray*dataArray = [[array.rac_sequence map:^id(NSDictionary *value) {
return[MoviceModel initWithDictionary:value];
}] array];
7.RACMulticastConnection:用于當一個信號被多次訂閱,多次創(chuàng)建信號,避免多次調(diào)用創(chuàng)建信號里的block.
用法:
// 1.創(chuàng)建信號
RACSignal*signal = [RACSignal createSignal:^RACDisposable*_Nullable(id_Nonnullsubscriber) {
[subscriber sendNext:@"123"];
returnnil;
}];
//2.創(chuàng)建連接
RACMulticastConnection*connection = [signal publish];
// 3.訂閱信號,
//注意:訂閱信號,也不能激活信號,只是保存訂閱者到數(shù)組,必須通過連接,當調(diào)用連接,就會一次性調(diào)用所有訂閱者的sendNext:
[connection.signal subscribeNext:^(id_Nullablex) {
NSLog(@"%@",x);
}];
[connection.signal subscribeNext:^(id_Nullablex) {
NSLog(@"%@",x);
}];
//4.連接激活信號
[connection connect];
8.RACCommand:使用場景:監(jiān)聽按鈕點擊、網(wǎng)絡(luò)請求
用法:
// 1.創(chuàng)建命令
self.command= [[RACCommand alloc]initWithSignalBlock:^RACSignal*_Nonnull(id_Nullableinput) {
NSLog(@"%@",input);
// 2.創(chuàng)建信號,用來傳遞數(shù)據(jù)
return[RACSignal createSignal:^RACDisposable*_Nullable(id_Nonnullsubscriber) {
[subscriber sendNext:@"數(shù)據(jù)解析后的數(shù)據(jù)"];
//數(shù)據(jù)傳遞完,調(diào)用sendCompleted,命令才執(zhí)行完
[subscriber sendCompleted];
returnnil;
}];
}];
//3.訂閱racCommand中的信號
[self.command.executionSignals subscribeNext:^(id_Nullablex) {
NSLog(@"%@",x);
[x subscribeNext:^(id_Nullablex) {
NSLog(@"%@",x);
}];
}];或者使用:
[self.command.executionSignals.switchToLatest subscribeNext:^(id_Nullablex) {
NSLog(@"%@",x);
}];
//4.執(zhí)行命令
[self.command execute:@"網(wǎng)絡(luò)請求參數(shù)"];
其他用法:
//skip:1 跳過第一次信號
[[self.command.executionSignals skip:1]subscribeNext:^(id_Nullablex) {
NSLog(@"x_%@",x);
}];
二.ReactiveCocoa在開發(fā)中的常見用法(NSRect轉(zhuǎn)化CGRect需要先將NSRect轉(zhuǎn)化NSValue)
1.代替代理:rac_signalForSelector代替代理
2.代替KVO:rac_observeKeyPath (需要導入頭文件NSObject+RACKVOWrapper)
3.監(jiān)聽事件:rac_signalForControlEvents
4.代替通知:rac_addObserverForName(常用通知中心監(jiān)聽鍵盤)
例如:獲取鍵盤高度
[[[NSNotificationCenterdefaultCenter]rac_addObserverForName:UIKeyboardWillShowNotificationobject:nil]subscribeNext:^(NSNotification*_Nullablex) {
NSValue*rectValue = [xuserInfo][UIKeyboardFrameEndUserInfoKey];
NSLog(@"%f",rectValue.CGRectValue.size.height);
}];
5.監(jiān)聽文本內(nèi)容改變:rac_textSignal
三.ReactiveCocoa常用宏
1.RAC(TARGET, [KEYPATH, [NIL_VALUE]]:用于給某個對象的某個屬性進行綁定
例如:RAC(self.labelView,text) = _textField.rac_textSignal;只要文本框_textField文字改變,就會修改label text的文字
2.RACObserve(<#TARGET#>, <#KEYPATH#>):監(jiān)聽某個對象的某個屬性,返回的是信號
3.@weakify(Obj)和@strongify(Obj):兩個配套使用解決循環(huán)引用的問題。
4.RACTuplePack:打包成元組RACTupleUnpack:解包