3

Reactive Cocoa はまったくの初心者です。ドキュメントといくつかのチュートリアルに時間を費やした後、比較的単純なことをしようとしているときにトリックを見逃しているに違いないと思います(願っています!)。

演習として、4 桁のコンビネーション ロックのロジックを記述しようとしています。

ユーザーはスクロールホイールを使用して入力し、1 番が正しい場合は 2 番しか入力できず、2 番が選択されている場合は 3 番しか入力できません。それらが等しい場合、システムを進めて、パスの組み合わせの 2 桁目と照合します。

ユーザー入力から RACSignal を作成する方法はわかりますが、RACSequence シーケンスを ...filter:?...combineLatest: で進めるために、「正しい」数字と照合するためにどのパターンを使用すればよいかわかりません。 ?

私はこれに頭を悩ませようとしているだけなので、コード例は高く評価されますが、正しい方向への一般的な概念的なポインターは素晴らしいでしょう.

4

1 に答える 1

1

これを行う 1 つの方法は次のとおりです。ロック上の各ホイールの現在の値を表す NSNumbers の信号とsuccessIndicator、組み合わせが正しいかどうかを示すものがあると仮定します。

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);
};

すべての入力がシグナルとして表されると、通常の操作 (値を操作する) を RAC 操作 (値のストリームを操作する) に置き換えて、標準の Objective-C で行うように大まかに進めることができます。

各操作は、値のストリームを別の値のストリームに変換するステップを表します。各ステップは、最初の値のストリームを必要な値のストリームに変換する次のステップを表す新しいシグナルになります。

関連して、最後の操作には出力信号がなく、副作用を引き起こす唯一の場所です。値を変換および結合するロジックと、副作用を実行するロジックを分離することをお勧めします。このようにして、ロックされたシグナルにオブザーバーを追加したり、意図しない結果を心配することなくロックされたコードに影響を与えるコードをリファクタリングしたりできます。

次の課題は、正しい組み合わせへの変更、またはロックの車輪の数を処理することです。

于 2013-09-21T21:51:33.977 に答える