ReactiveCocoa学习笔记(一)

2016-04-12  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读