私は ReactiveCocoa を使っていて、興味深い問題に遭遇しました。醜いステートフルなソリューションはいくつでも思いつくことができますが、何らかの理由で私の頭の中で具体化されていないエレガントで機能的な方法があると確信しています。多分あなたは助けることができます!
ここでの入力信号は、 のような 2 つの部分文字列です"<letter>,<number>"
。望ましいソート ルールは、特定の文字について、入力値が の順序で出力に表示され<number>
(つまり、 のA,2
前に表示されないA,1
)、すべての文字<letter>
出力でアルファ オーダーに違反しないことです。(つまり、 で始まる文字列は、 で始まるB
文字列が少なくとも 1 つ表示されるまで表示されるべきではありませんA
。) これらのルールで指定されている場合を除き、入力に送信された順序で出力に到達することが期待されます。
次のコードを検討してください。
RACSubject* input = [RACSubject subject];
RACSignal* output = [input <SOME CHAIN OF SIGNAL FUNCTIONS>];
[output subscribeNext:^(id x) { NSLog(@"(%@)",x); }];
[input sendNext: @"A,2"]; // Expect no output
[input sendNext: @"B,4"]; // Expect no output
[input sendNext: @"B,2"]; // Expect no output
[input sendNext: @"B,1"]; // Expect no output
[input sendNext: @"A,1"]; // Expect output: (A,1) (A,2) (B,1) (B,2)
// Note: (A,1) (B,1) (B,2) (A,2) would *not* be right because A,2 appeared on the input before B,1
[input sendNext: @"C,1"]; // Expect output: (C,1)
[input sendNext: @"B,3"]; // Expect output: (B,3) (B,4)
[input sendNext: @"C,3"]; // Expect no output
[input sendNext: @"C,2"]; // Expect output: (C,2) (C,3)
また、出力は「積極的に」生成する必要があります。出力を見る前に入力信号が完了するまで待たなければならない場合は役に立ちません (もちろん、並べ替え規則でそうであると指示されている場合を除きます。つまり、A,1
最後に来た場合) 。
何か案は?