2013-09-21 25 views
3

我完全不熟悉反应可可。花了一些时间阅读文档和一些教程后,我想我必须错过一个技巧,同时尝试做一些相对简单的事情(我希望!)。组合锁逻辑 - 反应可可

我想写一个4位组合锁的逻辑作为练习。

用户使用滚轮输入并且只能在数字1正确时输入数字2,当数字2被选择时等于3等等。基本上,我需要观察输入的数字流,检查'正确'号码,当它们相等时,提前系统检查通过组合的第二位数字。

我可以看到如何从用户输入中创建一个RACSignal,但我不确定使用什么模式来检查'正确'的数字,以便使用... filter:进度序列RACSequence。 ..combineLatest:?

我只是试图让我的头,这样的代码示例表示赞赏,但一个正确的方向的一般概念指针将是伟大的。

+0

看起来像我在你的问题的中间掠过。已经更新了我的答案! –

回答

1

下面是做这件事的一种方法:假设你有代表对锁的每个车轮和successIndicator的当前值NSNumbers的信号指示组合是否是正确的:

NSArray *correctCombination = @[@1, @2, @3, @4)]; 
RACSignal *currentCombination = [RACSignal combineLatest:@[digit1, digit2, digit3, digit4]; 

RACSignal *(^hasCorrectValue)(NSUInteger idx) ^(NSUInteger idx){ 
    return [currentCombination map:^(RACTuple *currentCombination) { 
     return [currentCombination[idx] isEqual:correctCombination[idx]]; 
    }]; 
}; 

__block RACSignal *(^hasUnlockedStage)(NSUInteger idx) = ^(NSUInteger idx){ 
    if (idx == 0) return hasCorrectValue(idx); 
    else return [hasCorrectValue(idx) and:hasUnlockedStage(idx - 1)]; 
}; 

[hasUnlockedStage(0) setKeypath:@keypath(wheel2, enabled) onObject:wheel2]; 
[hasUnlockedStage(1) setKeypath:@keypath(wheel3, enabled) onObject:wheel3]; 
[hasUnlockedStage(2) setKeypath:@keypath(wheel4, enabled) onObject:wheel4]; 
[hasUnlockedStage(3) setKeypath:@keypath(successIndicator, active) onObject:successIndicator]; 

hasUnlockedStage = nil; // nil out recursive block 

中间部分,其中逻辑发生,是非常相似的非反应性:

BOOL(^hasCorrectValue)(NSUInteger idx) ^(NSUInteger idx){ 
    return [[views[idx] currentValue] isEqual:[correctCombination[idx] currentValue]]; 
}; 

__block BOOL(^hasUnlockedStage)(NSUInteger idx) = ^(NSUInteger idx){ 
    if (idx == 0) return hasCorrectValue(idx); 
    else return hasCorrectValue(idx) && hasUnlockedStage(idx - 1); 
}; 

一旦所有的输入被表示为信号,可以大致如我们将在标准Objective-C的进行,代替RAC操作(其操作在值流上)用于正常操作(按值操作)。

每个操作表示将值流转换为另一个值流的步骤。每一步都会产生一个新的信号,它代表将我们的初始值流转换为我们想要的值流的进一步步骤。

相关地,最后一个操作没有输出信号,只是我们引起任何副作用的地方。分离转换和组合值的逻辑和执行副作用的逻辑是一种很好的做法。这样,我们可以为锁定的信号添加额外的观察者,或者重构影响锁定的代码,而不用担心意外的后果。

一个不错的下一个练习是处理对正确组合的更改或锁上车轮的数量。

+0

嗨克里斯,道歉不能早日回复你,只是想能够让我的头绕着你的答案。它有很多帮助,我现在对现在发生的事情有了更好的理解,尽管我还没有接受你的“下一次锻炼”挑战!也许很快......希望这个例子问答对其他人也有用。 – slupek2013