如何使用ReactiveCocoa

时间:2015-09-04 08:36:36

标签: chaining reactive-cocoa

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

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

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

此处,callUserCommandRACCommand,需要async。它实际上可以有三个返回值:"accepted", "cancelled", "declined"

接受和取消将打破操作顺序并且不会执行其余操作。 拒绝,应继续执行序列的其余部分。

我尝试了类似下面的内容,但实际上无法完成上述内容。

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

    [signal subscribeNext:^(id x) {

    } error:^(NSError *error) {

    } completed:^{

    }];

1 个答案:

答案 0 :(得分:1)

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

也许您可以尝试takeUntiltakeWhile。我会像RAC一样用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);
    }];

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