私は、解決策を見つけたと思います。秘訣は、キャンセル信号をティック信号にマージしてから、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