#pragma mark 指令
-(void) instructionDemo
{
// 创建使能信号
RACSignal * signal = [self.textField.rac_textSignal map:^id(id value) {
return @([value rangeOfString:@"@"].location != NSNotFound);
}];
// 任何时候button被点击就会执行signalBlock,rac_command属性会监控使能信号signal和button的enabled属性
self.button.rac_command = [[RACCommand alloc]initWithEnabled:signal
signalBlock:^RACSignal *(id input) {
NSLog(@"button was pressed");
return [RACSignal empty];
}];
// [RACSignal empty]
// RACCommand的executionSignal管道(pipe)下发出去。这个信号代表button按下时一些任务需要被处理。在这个处理信号没有返回一个'complete value'('empty '会立即返回一个'complete value')之前button将会保持不可用状态.因为这个例子中我们只是打印了一下,所以这里我们只返回一个empty信号
}
#pragma mark 状态推导
-(void) inferStatueDemo;
{
[self.textField.rac_textSignal subscribeNext:^(id x){
NSLog(@"New Value: %@",x);
}];
RACSignal * signal = [self.textField.rac_textSignal map:^id(id value) {
return @([value rangeOfString:@"@"].location != NSNotFound);
}];
RAC(self.button, enabled) = signal;
RAC(self.textField, textColor) = [signal map:^id(id value) {
if ([value boolValue]) {
return [UIColor greenColor];
}
return [UIColor redColor];
}];
}
#pragma mark rac_sequeuece 简单使用
-(void) rac_sequeueceUseDemo
{
// 使用rac_sequeuece我们能够轻松地将数组转化为一个流
NSArray *array = @[ @1, @2, @3 ];
RACSequence * stream = [array rac_sequence];
// map是一种映射关系 将stream映射成了新的流
[stream map:^id (id value){
return @(pow([value integerValue], 2));
}];
// 跟数组一样,流不能包含nil元素
NSLog(@"%@",[stream array]);
NSLog(@"%@",[[[array rac_sequence] map:^id(id value) {
return @(pow([value integerValue], 2));
}]array]);
// 如何让一个序列流合并为单个值
NSLog(@"%@", [[[array rac_sequence] map:^id(id value) {
return [value stringValue];
}] foldLeftWithStart:@"" reduce:^id(id accumulator, id value) {
return [accumulator stringByAppendingString:value];
}]);
}