#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]; }]); }
原文:http://www.cnblogs.com/ToBeFrank/p/4986229.html