常見用法
- rac_signalForSelector : 代替代理
- rac_valuesAndChangesForKeyPath: KVO
- rac_signalForControlEvents:監(jiān)聽事件
- rac_addObserverForName 代替通知
- rac_textSignal:監(jiān)聽文本框文字改變
- rac_liftSelector:withSignalsFromArray:Signals:當傳入的Signals(信號數(shù)組),每一個signal都至少sendNext過一次,就會去觸發(fā)第一個selector參數(shù)的方法。
常見宏
- RAC(TARGET, [KEYPATH, [NIL_VALUE]]):用于給某個對象的某個屬性綁定
- RACObserve(self, name) :監(jiān)聽某個對象的某個屬性,返回的是信號。
- @weakify(Obj)和@strongify(Obj)
- RACTuplePack :把數(shù)據(jù)包裝成RACTuple(元組類)
- RACTupleUnpack:把RACTuple(元組類)解包成對應的數(shù)據(jù)
- RACChannelTo 用于雙向綁定的一個終端
常用操作方法
flattenMap map 用于把源信號內容映射成新的內容。
concat 組合 按一定順序拼接信號,當多個信號發(fā)出的時候,有順序的接收信號
then 用于連接兩個信號,當?shù)谝粋€信號完成,才會連接then返回的信號。
merge 把多個信號合并為一個信號,任何一個信號有新值的時候就會調用
zipWith 把兩個信號壓縮成一個信號,只有當兩個信號同時發(fā)出信號內容時,并且把兩個信號的內容合并成一個元組,才會觸發(fā)壓縮流的next事件。
combineLatest:將多個信號合并起來,并且拿到各個信號的最新的值,必須每個合并的signal至少都有過一次sendNext,才會觸發(fā)合并的信號。
reduce聚合:用于信號發(fā)出的內容是元組,把信號發(fā)出元組的值聚合成一個值
filter:過濾信號,使用它可以獲取滿足條件的信號.
ignore:忽略完某些值的信號.
distinctUntilChanged:當上一次的值和當前的值有明顯的變化就會發(fā)出信號,否則會被忽略掉。
take:從開始一共取N次的信號
takeLast:取最后N次的信號,前提條件,訂閱者必須調用完成,因為只有完成,就知道總共有多少信號.
takeUntil:(RACSignal *):獲取信號直到某個信號執(zhí)行完成
skip:(NSUInteger):跳過幾個信號,不接受。
switchToLatest:用于signalOfSignals(信號的信號),有時候信號也會發(fā)出信號,會在signalOfSignals中,獲取signalOfSignals發(fā)送的最新信號。
doNext: 執(zhí)行Next之前,會先執(zhí)行這個Block
doCompleted: 執(zhí)行sendCompleted之前,會先執(zhí)行這個Block
timeout:超時,可以讓一個信號在一定的時間后,自動報錯。
interval 定時:每隔一段時間發(fā)出信號
delay 延遲發(fā)送next。
retry重試 :只要失敗,就會重新執(zhí)行創(chuàng)建信號中的block,直到成功.
replay重放:當一個信號被多次訂閱,反復播放內容
throttle節(jié)流:當某個信號發(fā)送比較頻繁時,可以使用節(jié)流,在某一段時間不發(fā)送信號內容,過了一段時間獲取信號的最新內容發(fā)出。
RACSequence和RACTuple簡單使用 遍歷數(shù)組或字典
// 1.遍歷數(shù)組
NSArray *numbers = @[@1,@2,@3,@4];
// 這里其實是三步
// 第一步: 把數(shù)組轉換成集合RACSequence numbers.rac_sequence
// 第二步: 把集合RACSequence轉換RACSignal信號類,numbers.rac_sequence.signal
// 第三步: 訂閱信號,激活信號,會自動把集合中的所有值,遍歷出來。
[numbers.rac_sequence.signal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
// 2.遍歷字典,遍歷出來的鍵值對會包裝成RACTuple(元組對象)
NSDictionary *dict = @{@"name":@"xmg",@"age":@18};
[dict.rac_sequence.signal subscribeNext:^(RACTuple *x) {
// 解包元組,會把元組的值,按順序給參數(shù)里面的變量賦值
RACTupleUnpack(NSString *key,NSString *value) = x;
// 相當于以下寫法
// NSString *key = x[0];
// NSString *value = x[1];
NSLog(@"%@ %@",key,value);
}];
// 3.字典轉模型
// 3.1 OC寫法
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"flags.plist" ofType:nil];
NSArray *dictArr = [NSArray arrayWithContentsOfFile:filePath];
NSMutableArray *items = [NSMutableArray array];
for (NSDictionary *dict in dictArr) {
FlagItem *item = [FlagItem flagWithDict:dict];
[items addObject:item];
}
// 3.2 RAC寫法
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"flags.plist" ofType:nil];
NSArray *dictArr = [NSArray arrayWithContentsOfFile:filePath];
NSMutableArray *flags = [NSMutableArray array];
_flags = flags;
// rac_sequence注意點:調用subscribeNext,并不會馬上執(zhí)行nextBlock,而是會等一會。
[dictArr.rac_sequence.signal subscribeNext:^(id x) {
// 運用RAC遍歷字典,x:字典
FlagItem *item = [FlagItem flagWithDict:x];
[flags addObject:item];
}];
NSLog(@"%@", NSStringFromCGRect([UIScreen mainScreen].bounds));
// 3.3 RAC高級寫法:
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"flags.plist" ofType:nil];
NSArray *dictArr = [NSArray arrayWithContentsOfFile:filePath];
// map:映射的意思,目的:把原始值value映射成一個新值
// array: 把集合轉換成數(shù)組
// 底層實現(xiàn):當信號被訂閱,會遍歷集合中的原始值,映射成新值,并且保存到新的數(shù)組里。
NSArray *flags = [[dictArr.rac_sequence map:^id(id value) {
return [FlagItem flagWithDict:value];
}] array];
RACCommand簡單使用
RACCommand使用步驟:
1.創(chuàng)建命令
RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
NSLog(@"執(zhí)行命令");
// 創(chuàng)建空信號,必須返回信號
// return [RACSignal empty];
// 2.創(chuàng)建信號,用來傳遞數(shù)據(jù)
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"請求數(shù)據(jù)"];
// 注意:數(shù)據(jù)傳遞完,最好調用sendCompleted,這時命令才執(zhí)行完畢。
[subscriber sendCompleted];
return nil;
}];
}];
// 強引用命令,不要被銷毀,否則接收不到數(shù)據(jù)
_conmmand = command;
// 3.訂閱RACCommand中的信號
[command.executionSignals subscribeNext:^(id x) {
[x subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
}];
// RAC高級用法
// switchToLatest:用于signal of signals,獲取signal of signals發(fā)出的最新信號,也就是可以直接拿到RACCommand中的信號
[command.executionSignals.switchToLatest subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
// 4.監(jiān)聽命令是否執(zhí)行完畢,默認會來一次,可以直接跳過,skip表示跳過第一次信號。
[[command.executing skip:1] subscribeNext:^(id x) {
if ([x boolValue] == YES) {
// 正在執(zhí)行
NSLog(@"正在執(zhí)行");
}else{
// 執(zhí)行完成
NSLog(@"執(zhí)行完成");
}
}];
// 5.執(zhí)行命令
[self.conmmand execute:@1];
3.處理多個請求,都返回結果的時候,統(tǒng)一做處理.
RACSignal *request1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// 發(fā)送請求1
[subscriber sendNext:@"發(fā)送請求1"];
return nil;
}];
RACSignal *request2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// 發(fā)送請求2
[subscriber sendNext:@"發(fā)送請求2"];
return nil;
}];
// 使用注意:幾個信號,參數(shù)一的方法就幾個參數(shù),每個參數(shù)對應信號發(fā)出的數(shù)據(jù)。
[self rac_liftSelector:@selector(updateUIWithR1:r2:) withSignalsFromArray:@[request1,request2]];
}
// 更新UI
- (void)updateUIWithR1:(id)data r2:(id)data1
{
NSLog(@"更新UI%@ %@",data,data1);
}