ReactiveCocoa学习笔记(一)
//
// 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