如何使用 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:^{
}];
如果我理解正确的话,您希望一个接一个地执行序列,直到其中一个呼叫被接受或取消。
也许你可以试试 takeUntil
或 takeWhile
。我会像这样用 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);
}];
在上面的示例代码中,将不会呼叫拒绝呼叫的最后一个用户。
假设我有一个电话应用程序。我有一个功能,我想尝试一个一个地调用一组用户,并在其中一个用户接受调用或取消整个操作时中断序列。
我将尝试在伪代码中像这样简化它:
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:^{
}];
如果我理解正确的话,您希望一个接一个地执行序列,直到其中一个呼叫被接受或取消。
也许你可以试试 takeUntil
或 takeWhile
。我会像这样用 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);
}];
在上面的示例代码中,将不会呼叫拒绝呼叫的最后一个用户。