RAC集合類:
- RACTuple:元組,類似NSArray,用來包裝值
- RACSequence:RAC中集合,用于替代NSArray,NSDictionary可以使用它快速遍歷.
NSArray *arr = @[@"12",@"2121",@1];
NSDictionary *dic = @{@"name":@"zhangsan",@"age":@"15",@"height":@"165"};
RACTuple *tuple = [RACTuple tupleWithObjectsFromArray:arr];
NSLog(@"%@",tuple[0]);
//將集合轉(zhuǎn)化為RACSequence集合
RACSequence *sequence = arr.rac_sequence;
RACSignal *singal = sequence.signal;
[singal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
//數(shù)組遍歷.
[arr.rac_sequence.signal subscribeNext:^(id x) {
NSLog(@"常用寫法%@",x);
}];
//字典遍歷RACTuple元組包裝相應(yīng)key:value
[dic.rac_sequence.signal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
RAC開發(fā)中常見用法:
- 代替代理
- kvo
- 通知
- 監(jiān)聽事件
- 文本框改變
代碼實現(xiàn)
//監(jiān)聽某個某個對象的方法是否調(diào)用:代理的rac另外一種實現(xiàn)
[[self.reaVIew rac_signalForSelector:@selector(didClickAction:)] subscribeNext:^(id x) {
NSLog(@"點擊按鈕,但無法傳值,x:%@",x);
/*
點擊按鈕,但無法傳值,x:<RACTuple: 0x60000039cea0> (
"<UIButton: 0x7fc888c13890; frame = (97 63; 46 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x600000197e20>>"
)
*/
}];
//替代kvo,需要手動導(dǎo)入另外的頭文件默認沒導(dǎo)入
[self.reaVIew rac_observeKeyPath:@"frame" options:NSKeyValueObservingOptionNew observer:nil block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) {
NSLog(@"frame屬性發(fā)生改變");
}];
[[self.view rac_valuesForKeyPath:@"frame" observer:nil]subscribeNext:^(id x) {
NSLog(@"frame屬性發(fā)生改變%@",x);
}];
//監(jiān)聽事件
UIButton *btn = [[UIButton alloc]init];
[[btn rac_signalForControlEvents:UIControlEventTouchUpInside]subscribeNext:^(id x) {
NSLog(@"按鈕點擊了");
}];
[[[NSNotificationCenter defaultCenter]rac_addObserverForName:UIKeyboardWillShowNotification object:nil]subscribeNext:^(id x) {
NSLog(@"通知");
}];
//監(jiān)聽文本框
UITextField *textField = [[UITextField alloc]init];
[[textField rac_textSignal]subscribeNext:^(id x) {
NSLog(@"文本框改變");
}];