假设我有一个电话应用程序。我有一个功能,我想尝试逐个调用一个用户数组,并在其中一个用户接受呼叫时,或者当整个操作被取消时中断序列。
我将尝试在伪代码中简化它:
for(user in users) {
result = callUserCommand(user);
if(result == "accepted" || result == "cancelled") {
break;
}
}
此处,callUserCommand
是RACCommand
,需要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:^{
}];
答案 0 :(得分:1)
如果我理解正确,您希望逐个执行序列,直到其中一个呼叫被接受或取消。
也许您可以尝试takeUntil
或takeWhile
。我会像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);
}];
在上面的示例代码中,拒绝呼叫的最后一个用户将无法呼叫。