//
//? 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];
//? ? //信號(hào)開關(guān)Switch
//? ? [self signalSwitch];
//? ? //組合信號(hào) 相當(dāng)于與運(yùn)算&
//? ? [self combiningLatest];
//? ? //合并信號(hào) 相當(dāng)于或運(yùn)算|
//? ? [self merge];
}
- (void)naviConfig
{
}
- (void)uppercaseString {
NSArray *signalArr = @[@"you", @"are", @"beautiful"];
//? ? //1.把NSArray通過(guò)rac_sequence方法生成RAC中的Sequence
//? ? RACSequence *sequence = [signalArr rac_sequence];
//? ? //2.獲取該Sequence對(duì)象的信號(hào)量
//? ? RACSignal *signal = sequence.signal;
//? ? //3.調(diào)用Signal的Map方法邻悬,使每個(gè)元素的首字母大寫
//? ? RACSignal *capitalizedSignal = [signal map:^id(id value) {
//? ? ? ? return [value capitalizedString];
//? ? }];
//? ? //4.通過(guò)subscribNext方法對(duì)其進(jìn)行遍歷輸出
//? ? [signal subscribeNext:^(id x) {
//? ? ? ? NSLog(@"signal --- %@", x);
//? ? }];
//? ? [NSThread sleepForTimeInterval:1.0f];
//? ? [capitalizedSignal subscribeNext:^(id x) {
//? ? ? ? NSLog(@"capitalizedSignal --- %@", x);
//? ? }];
//以上一坨可以轉(zhuǎn)成下面這樣
[[[[signalArr rac_sequence] signal] map:^id(id value) {
return [value capitalizedString];
}] subscribeNext:^(id x) {
NSLog(@"capitalizedSignal --- %@", x);
}];
#warning 但是這是要干嘛呢?耕渴?拘悦?
}
/*
(1) 首先創(chuàng)建3個(gè)自定義信號(hào)量(3個(gè)水管),前兩個(gè)水管是用來(lái)接通不同的水源的(google, baidu), 而最后一個(gè)信號(hào)量是用來(lái)對(duì)接不同水源水管的水管(signalOfSignal)橱脸。signalOfSignal接baidu水管上础米,他就流baidu水源的水,接google水管上就流google水源的水添诉。
(2) 把signalOfSignal信號(hào)量通過(guò)switchToLatest方法加工成開關(guān)信號(hào)量屁桑。
(3) 緊接著是對(duì)通過(guò)開關(guān)數(shù)據(jù)進(jìn)行處理。
(4) 開關(guān)對(duì)接baidu信號(hào)量栏赴,然后baidu和google信號(hào)量同時(shí)往水管里灌入數(shù)據(jù)蘑斧,那么起作用的是baidu信號(hào)量。
(5) 開關(guān)對(duì)接google信號(hào)量须眷,google和baidu信號(hào)量發(fā)送數(shù)據(jù)竖瘾,則google信號(hào)量輸出到signalOfSignal中
*/
//信號(hào)開關(guān)Switch
- (void)signalSwitch
{
//創(chuàng)建3個(gè)自定義信號(hào)
RACSubject *google = [RACSubject subject];
RACSubject *baidu = [RACSubject subject];
RACSubject *signalOfSignal = [RACSubject subject];
//獲取開關(guān)信號(hào)
RACSignal *switchSignal = [signalOfSignal switchToLatest];
#warning 這里用到了上面寫的那一坨了-_-!!
//對(duì)通過(guò)開關(guān)的信號(hào)量進(jìn)行操作
[[switchSignal map:^id(id value) {
return [@"https://www." stringByAppendingFormat:@"%@", value];
}] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
//通過(guò)開關(guān)打開baidu
[signalOfSignal sendNext:baidu];
[baidu sendNext:@"baidu.com"];
[google sendNext:@"google.com"];
//通過(guò)開關(guān)打開google
[signalOfSignal sendNext:google];
[baidu sendNext:@"baidu.com/"];
[google sendNext:@"google.com/"];
#warning 看到這里 好像有點(diǎn)意思了。花颗。捕传。
}
/*
(1) 首先創(chuàng)建兩個(gè)自定義的信號(hào)量letters和numbers
(2) 把兩個(gè)信號(hào)量通過(guò)combineLatest函數(shù)進(jìn)行合并,combineLatest說(shuō)明要合并信號(hào)量中最后發(fā)送的值
(3) reduce塊中是合并規(guī)則:把numbers中的值拼接到letters信號(hào)量中的值后邊扩劝。
(4) 經(jīng)過(guò)上面的步驟就是創(chuàng)建所需的相關(guān)信號(hào)量庸论,也就是相當(dāng)于架好運(yùn)輸?shù)墓艿馈=又覀兙涂梢酝ㄟ^(guò)sendNext方法來(lái)往信號(hào)量中發(fā)送值了棒呛,也就是往管道中進(jìn)行灌水聂示。
*/
//組合信號(hào)
- (void)combiningLatest
{
//創(chuàng)建兩個(gè)自定義信號(hào)
RACSubject *lettets = [RACSubject subject];
RACSubject *numbers = [RACSubject subject];
//通過(guò)combineLatest函數(shù)進(jìn)行合并
[[RACSignal combineLatest:@[lettets, numbers] reduce:^(NSString *letter, NSString *number){
return [letter stringByAppendingString:number];
}] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
#warning 這里建議大家分開打印? 寫一行打印一行? 相信你會(huì)有所領(lǐng)悟的
//B1 C1 C2
[lettets sendNext:@"A"];
[lettets sendNext:@"B"];
[numbers sendNext:@"1"];
[lettets sendNext:@"C"];
[numbers sendNext:@"2"];
#warning 信號(hào)量的合并說(shuō)白了就是把兩個(gè)水管中的水合成一個(gè)水管中的水。但這個(gè)合并有個(gè)限制簇秒,當(dāng)兩個(gè)水管中都有水的時(shí)候才合并鱼喉。如果一個(gè)水管中有水,另一個(gè)水管中沒(méi)有水,那么有水的水管會(huì)等到無(wú)水的水管中來(lái)水了蒲凶,在與這個(gè)水管中的水按規(guī)則進(jìn)行合并气筋。下面這個(gè)實(shí)例就是把兩個(gè)信號(hào)量進(jìn)行合并。簡(jiǎn)單點(diǎn)說(shuō)就是當(dāng)兩個(gè)都有水時(shí)旋圆,任何改變都會(huì)觸發(fā)宠默。
}
/*
(1) 創(chuàng)建三個(gè)自定義信號(hào)量, 用于merge
(2) 合并上面創(chuàng)建的3個(gè)信號(hào)量
(3) 往信號(hào)里灌入數(shù)據(jù)
*/
//合并信號(hào)
- (void)merge
{
//創(chuàng)建三個(gè)自定義信號(hào)量
RACSubject *lettets = [RACSubject subject];
RACSubject *numbers = [RACSubject subject];
RACSubject *chineses = [RACSubject subject];
//合并上面創(chuàng)建的3個(gè)信號(hào)量
[[RACSignal merge:@[lettets, numbers, chineses]] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
#warning 這里和上面的組合信號(hào)一樣? 一個(gè)一個(gè)打印? 你就懂了
[lettets sendNext:@"AAA"];
[numbers sendNext:@"666"];
[chineses sendNext:@"你好!"];
#warning 信號(hào)合并就理解起來(lái)就比較簡(jiǎn)單了灵巧,merge信號(hào)量規(guī)則比較簡(jiǎn)單搀矫,就是把多個(gè)信號(hào)量,放入數(shù)組中通過(guò)merge函數(shù)來(lái)合并數(shù)組中的所有信號(hào)量為一個(gè)刻肄。類比一下瓤球,合并后,無(wú)論哪個(gè)水管中有水都會(huì)在merge產(chǎn)生的水管中流出來(lái)的敏弃。
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end