美文网首页
ReactiveCocoa学习笔记(一)

ReactiveCocoa学习笔记(一)

作者: 神魔狼 | 来源:发表于2016-04-12 13:52 被阅读111次

    //

    //  ViewController.m

    //  InformationServices

    //

    //  Created by lcc on 16/4/11.

    //  Copyright © 2016年 lcc. All rights reserved.

    //

    #import "ViewController.h"

    #import <ReactiveCocoa/ReactiveCocoa.h>

    #import <ReactiveCocoa/RACEXTScope.h>

    @interface ViewController ()

    @end

    @implementation ViewController

    - (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    [self naviConfig];

    //    [self uppercaseString];

    //    //信号开关Switch

    //    [self signalSwitch];

    //    //组合信号 相当于与运算&

    //    [self combiningLatest];

    //    //合并信号 相当于或运算|

    //    [self merge];

    }

    - (void)naviConfig

    {

    }

    - (void)uppercaseString {

    NSArray *signalArr = @[@"you", @"are", @"beautiful"];

    //    //1.把NSArray通过rac_sequence方法生成RAC中的Sequence

    //    RACSequence *sequence = [signalArr rac_sequence];

    //    //2.获取该Sequence对象的信号量

    //    RACSignal *signal = sequence.signal;

    //    //3.调用Signal的Map方法,使每个元素的首字母大写

    //    RACSignal *capitalizedSignal = [signal map:^id(id value) {

    //        return [value capitalizedString];

    //    }];

    //    //4.通过subscribNext方法对其进行遍历输出

    //    [signal subscribeNext:^(id x) {

    //        NSLog(@"signal --- %@", x);

    //    }];

    //    [NSThread sleepForTimeInterval:1.0f];

    //    [capitalizedSignal subscribeNext:^(id x) {

    //        NSLog(@"capitalizedSignal --- %@", x);

    //    }];

    //以上一坨可以转成下面这样

    [[[[signalArr rac_sequence] signal] map:^id(id value) {

    return [value capitalizedString];

    }] subscribeNext:^(id x) {

    NSLog(@"capitalizedSignal --- %@", x);

    }];

    #warning 但是这是要干嘛呢???

    }

    /*

    (1) 首先创建3个自定义信号量(3个水管),前两个水管是用来接通不同的水源的(google, baidu), 而最后一个信号量是用来对接不同水源水管的水管(signalOfSignal)。signalOfSignal接baidu水管上,他就流baidu水源的水,接google水管上就流google水源的水。

    (2) 把signalOfSignal信号量通过switchToLatest方法加工成开关信号量。

    (3) 紧接着是对通过开关数据进行处理。

    (4) 开关对接baidu信号量,然后baidu和google信号量同时往水管里灌入数据,那么起作用的是baidu信号量。

    (5) 开关对接google信号量,google和baidu信号量发送数据,则google信号量输出到signalOfSignal中

    */

    //信号开关Switch

    - (void)signalSwitch

    {

    //创建3个自定义信号

    RACSubject *google = [RACSubject subject];

    RACSubject *baidu = [RACSubject subject];

    RACSubject *signalOfSignal = [RACSubject subject];

    //获取开关信号

    RACSignal *switchSignal = [signalOfSignal switchToLatest];

    #warning 这里用到了上面写的那一坨了-_-!!

    //对通过开关的信号量进行操作

    [[switchSignal map:^id(id value) {

    return [@"https://www." stringByAppendingFormat:@"%@", value];

    }] subscribeNext:^(id x) {

    NSLog(@"%@",x);

    }];

    //通过开关打开baidu

    [signalOfSignal sendNext:baidu];

    [baidu sendNext:@"baidu.com"];

    [google sendNext:@"google.com"];

    //通过开关打开google

    [signalOfSignal sendNext:google];

    [baidu sendNext:@"baidu.com/"];

    [google sendNext:@"google.com/"];

    #warning 看到这里 好像有点意思了。。。

    }

    /*

    (1) 首先创建两个自定义的信号量letters和numbers

    (2) 把两个信号量通过combineLatest函数进行合并,combineLatest说明要合并信号量中最后发送的值

    (3) reduce块中是合并规则:把numbers中的值拼接到letters信号量中的值后边。

    (4) 经过上面的步骤就是创建所需的相关信号量,也就是相当于架好运输的管道。接着我们就可以通过sendNext方法来往信号量中发送值了,也就是往管道中进行灌水。

    */

    //组合信号

    - (void)combiningLatest

    {

    //创建两个自定义信号

    RACSubject *lettets = [RACSubject subject];

    RACSubject *numbers = [RACSubject subject];

    //通过combineLatest函数进行合并

    [[RACSignal combineLatest:@[lettets, numbers] reduce:^(NSString *letter, NSString *number){

    return [letter stringByAppendingString:number];

    }] subscribeNext:^(id x) {

    NSLog(@"%@",x);

    }];

    #warning 这里建议大家分开打印  写一行打印一行  相信你会有所领悟的

    //B1 C1 C2

    [lettets sendNext:@"A"];

    [lettets sendNext:@"B"];

    [numbers sendNext:@"1"];

    [lettets sendNext:@"C"];

    [numbers sendNext:@"2"];

    #warning 信号量的合并说白了就是把两个水管中的水合成一个水管中的水。但这个合并有个限制,当两个水管中都有水的时候才合并。如果一个水管中有水,另一个水管中没有水,那么有水的水管会等到无水的水管中来水了,在与这个水管中的水按规则进行合并。下面这个实例就是把两个信号量进行合并。简单点说就是当两个都有水时,任何改变都会触发。

    }

    /*

    (1) 创建三个自定义信号量, 用于merge

    (2) 合并上面创建的3个信号量

    (3) 往信号里灌入数据

    */

    //合并信号

    - (void)merge

    {

    //创建三个自定义信号量

    RACSubject *lettets = [RACSubject subject];

    RACSubject *numbers = [RACSubject subject];

    RACSubject *chineses = [RACSubject subject];

    //合并上面创建的3个信号量

    [[RACSignal merge:@[lettets, numbers, chineses]] subscribeNext:^(id x) {

    NSLog(@"%@",x);

    }];

    #warning 这里和上面的组合信号一样  一个一个打印  你就懂了

    [lettets sendNext:@"AAA"];

    [numbers sendNext:@"666"];

    [chineses sendNext:@"你好!"];

    #warning 信号合并就理解起来就比较简单了,merge信号量规则比较简单,就是把多个信号量,放入数组中通过merge函数来合并数组中的所有信号量为一个。类比一下,合并后,无论哪个水管中有水都会在merge产生的水管中流出来的。

    }

    - (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

    }

    @end

    相关文章

      网友评论

          本文标题:ReactiveCocoa学习笔记(一)

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