如何使用 ReactiveCocoa 按顺序执行一系列操作,中间可能会中断

How to execute an array of operations in order with possible breaks in the middle with ReactiveCocoa

假设我有一个电话应用程序。我有一个功能,我想尝试一个一个地调用一组用户,并在其中一个用户接受调用或取消整个操作时中断序列。

我将尝试在伪代码中像这样简化它:

for(user in users) {
    result = callUserCommand(user);
    if(result == "accepted" || result == "cancelled") {
        break;
    }
}

这里的callUserCommand是一个RACCommand需要async。它实际上可以有三个 return 值:"accepted", "cancelled", "declined".

Accepted 和Canceled 会打乱操作顺序,不会执行其余操作。 已拒绝,应继续执行其余序列。

我试过类似下面的方法,但确实无法完全完成我上面描述的事情。

    RACSignal *signal = [RACSignal concat:[users.rac_sequence map:^(User * user) {
        return [self.callUserCommand execute:user];
    }]];

    [signal subscribeNext:^(id x) {

    } error:^(NSError *error) {

    } completed:^{

    }];

如果我理解正确的话,您希望一个接一个地执行序列,直到其中一个呼叫被接受或取消。

也许你可以试试 takeUntiltakeWhile。我会像这样用 RAC 编写这个场景:

NSArray* users = @[@"decline", @"decline", @"decline", @"accept", @"decline"];

[[[[[users.rac_sequence signal]
    flattenMap:^RACStream *(NSString* userAction) {
        NSLog(@"Calling user (who will %@):", userAction);

        // return async call signal here
        return [RACSignal return:userAction];
    }]
    takeWhileBlock:^BOOL(NSString* resultOfCall) {
        return [resultOfCall isEqualToString:@"decline"];
    }]
    doCompleted:^{
        NSLog(@"Terminated");
    }]
    subscribeNext:^(NSString* userAction) {
        NSLog(@"User action: %@", userAction);
    }];

在上面的示例代码中,将不会呼叫拒绝呼叫的最后一个用户。