美文网首页ReactiveCocoa
ReactiveCocoa map和flattenMap的区别

ReactiveCocoa map和flattenMap的区别

作者: 绿绿清欢 | 来源:发表于2017-10-13 18:12 被阅读194次

ReactiveCocoa已经火了很久啦,而且有很多人在使用它,我所知道比较著名的有美团点评技术团队

入门级讲的简单详细清楚同时也兼具深刻的教程就是国外大神RayWenderlich的ReactiveCocoa教程啦,这里有篇中文翻译,里面有原文链接,大家可以对比着看一下。ReactiveCocoa教程

这里总结下我的阅读和学习经验:

  1. RACSignal ReactiveCocoa里传递的监听的都是信号,比如监听一个名叫username的UITextField的文本编辑情况,需要对它的rac_textSignal进行监听

    [[self.username.rac_textSignal subscribeNext:^(id x){
    NSLog(@"%@",x)}];
    

监听一个UIbutton的点击事件,对相应的点击事件信号做监听

[[self.button rac_signalForControlEvents: UIControlEventTouchUpInside] subscribeNext:^(id x){
NSLog(@"button clicked") }];

如果想进行异步网络请求,或者把已存在的异步网络请求转换成ReactiveCocoa模式,可以创建一个信号

-(RACSignal *)signInSignal{
return [RACSignal createSignal: ^RACDisposable *(id<RACSubscriber> subscriber){
  [HttpRequest body@{@"username":self.username.text, @"password":self.password.text} complete : ^(BOOL success){
[subscriber sendNext:@(success)];
[subscriber sendCompleted];
}];
return nil;
}];
}

然后在button点击事件里使用这个信号:

 [[self.button rac_signalForControlEvents: UIControlEventTouchUpInside] 
flattenMap: ^id (id x){
return [self signInSignal];
}
subscribeNext:^(id x){
NSLog(@"button clicked")
 }];
  1. subscribeNext [你的信号 :subscribeNext: ^(id x){}];subscribeNext就是对你提供的信号进行监听,并在随后的block里对其进行处理,你想监听某个信号,就调用subscribeNext监听它并对它进行处理。

  2. Map 其实是用来转化传递的信号的值的,例如把UITextField的文本text转换成监听它的length;或者把某BOOL值转换成不同的两种颜色

    RAC(self.username, backgroundColor) =
      [validUsernameSignal
      map:^id(NSNumber *usernameValid) {
       return [usernameValid boolValue] ? [UIColor clearColor] : [UIColor      yellowColor];
    }];
    
  3. flattenMap 像上面使用到的方法,它把之前监听的信号转换成另外一个信号,并对新的信号进行监听和处理。如果在使用flattenMap的地方使用map,打印的结果会很奇怪,也可以说map还是监听原来的那个信号,只是内容有变换;但是用flattenMap监听的信号就是新的信号。

相关文章

网友评论

    本文标题:ReactiveCocoa map和flattenMap的区别

    本文链接:https://www.haomeiwen.com/subject/tbnzyxtx.html