4

iOSでReactiveCocoaを使用してカウントダウンタイマーを実装したいと思います。タイマーはX秒間実行され、毎秒何かを実行する必要があります。私が理解できない部分は、タイムアウトをキャンセルする方法です。

RACSubscribable *oneSecGenerator = [RACSubscribable interval:1.0];
RACDisposable *timer = [[oneSecGenerator take:5] subscribeNext:^(id x) {
    NSLog(@"Tick");
}];
4

2 に答える 2

4

私は、解決策を見つけたと思います。秘訣は、キャンセル信号をティック信号にマージしてから、Xサンプルを取得することです。最終サブスクライバーは、ティック信号がティックするたびに次のイベントを受信し、「テイク」が終了すると完了しますキャンセルは、キャンセルタイマーでエラーを送信することで実装できます。

__block RACSubject *cancelTimer = [RACSubject subject];
RACSubscribable *tickWithCancel = [[RACSubscribable interval:1.0] merge:cancelTimer];
RACSubscribable *timeoutFiveSec = [tickWithCancel take:5];

[timeoutFiveSec subscribeNext:^(id x) {
    NSLog(@"Tick");
} error:^(NSError *error) {
    NSLog(@"Cancelled");
} completed:^{
    NSLog(@"Completed");
    [alert dismissWithClickedButtonIndex:-1 animated:YES];
}];

キャンセルを有効にするには、次の手順を実行する必要があります。

[cancelTimer sendError:nil]; // nil or NSError
于 2012-11-25T22:59:02.827 に答える
3

必要なことを正確に実行するTakeUntil演算子もあります。つまり、別のストリームが値を生成するまで、ストリームからのイベントを中継します。

于 2012-11-26T09:56:44.843 に答える