总结下ReactiveCocoa常用使用(浅层次,实力有限)

最近在接手旧的项目中看到了podFile文件ReactiveCocoa这个框架,于是就学习了下,也做了几个小demo.总结下所学到一些经验分享给大家:

使用场景:1.字典转模型

RACSequence和RACTuple简单使用

// 1.遍历数组

NSArray *numbers = @[@1,@2,@3,@4];

[numbers.rac_sequence.signal subscribeNext:^(id x) {

NSLog(@"%@",x);

}];

2.遍历字典,遍历出来的键值对会包装成RACTuple(元组对象)

NSDictionary *dict = @{@"name":@"xmg",@"age":@18};

[dict.rac_sequence.signal subscribeNext:^(RACTuple *x) {

// 解包元组,会把元组的值,按顺序给参数里面的变量赋值

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,并不会马上执行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: 把集合转换成数组

// 底层实现:当信号被订阅,会遍历集合中的原始值,映射成新值,并且保存到新的数组里。

NSArray *flags = [[dictArr.rac_sequence map:^id(id value) {

return [FlagItem flagWithDict:value];

}] array];

4.rac_signalForSelector:用于替代代理。

UIAlertView *alertView=[[UIAlertView alloc]initWithTitle:@"点击连接打印机类型" message:nil delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"启瑞QR-380A",@"汉印HM-A300", nil];

[alertView.rac_buttonClickedSignal subscribeNext:^(id x) {

NSLog(@"x=%@",x);

}];

这种方式可利用只有一个UIAlertView的时候。

[[self rac_signalForSelector:@selector(alertView:clickedButtonAtIndex:) fromProtocol:@protocol(UIAlertViewDelegate)] subscribeNext:^(RACTuple *tuple) {

NSLog(@"tuple==%@",tuple);

UIAlertView *alertView= tuple.first;

这种方式可以使用存在多个UIAlertView的时候

5.rac_valuesAndChangesForKeyPath:用于监听某个对象的属性改变。(KVO)

/ 把监听redV的center属性改变转换成信号,只要值改变就会发送信号// observer:可以传入nil

[[redV rac_valuesAndChangesForKeyPath:@"center" options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^(id x) {

NSLog(@"%@",x);

}];

6.rac_signalForControlEvents:用于监听某个事件

// 把按钮点击事件转换为信号,点击按钮,就会发送信号

[[self.btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {

NSLog(@"按钮被点击了");

}];

7.rac_addObserverForName:用于监听某个通知。

// 把监听到的通知转换信号

[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) {

NSLog(@"键盘弹出");

}];

8.rac_textSignal:只要文本框发出改变就会发出这个信号

// .监听文本框的文字改变

[_textField.rac_textSignal subscribeNext:^(id x) {

NSLog(@"文字改变了%@",x);

}];

9.处理当界面有多次请求时,需要都获取到数据时,才能展示界面rac_liftSelector:withSignalsFromArray:Signals:当传入的Signals(信号数组),每一个signal都至少sendNext过一次,就会去触发第一个selector参数的方法。使用注意:几个信号,参数一的方法就几个参数,每个参数对应信号发出的数据。

RACSignal *request1 = [RACSignal createSignal:^RACDisposable *(idsubscriber) {        // 发送请求1        [subscriber sendNext:@"发送请求1"];        return nil;    }];    RACSignal *request2 = [RACSignal createSignal:^RACDisposable *(idsubscriber) {

// 发送请求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);

}

等等....

为了方便大家:http://gold.xitu.io/entry/57764bb65bbb5000593755c7/promote?utm_source=baidu&utm_medium=keyword&utm_content=reactivecocoa&utm_campaign=q3_search

http://benbeng.leanote.com/post/ReactiveCocoaTutorial-part1上下2篇

demo:http://www.jianshu.com/p/a84e4a2704b3/comments/1496629

结合数据网络链接非常有帮助:https://github.com/ming1016/GCDFetchFeed/

你可能感兴趣的:(总结下ReactiveCocoa常用使用(浅层次,实力有限))