我正在建立一个功能,我的应用程序的用户可以找到他们的Facebook好友并将其添加到应用程序中。我需要做三个步骤:
一旦完成所有这些,我就需要将三个结果数组合并/减少到最终数组中。
我创建了三个都返回RACSignal
getUsersWithFacebookIds
,getConnectedUsers
和getFacebookUsers
我不确定如何使用ReactiveCocoa连接所有这些。
答案 0 :(得分:7)
Once All Are Done Do Something With All
,可以通过以下方式实现:
[[RACSignal combineLatest:@[connectUsersSignal,facebookUsersSignal,applicationUsersSignal]] subscribeNext:^(RACTuple *users) {
NSArray *connectedUsers = [users first];
NSArray *facebookUsers = [users second];
NSArray *applicationUsers = [users third];
}];
缺少的另一部分是如何使applicationUsersSignal
依赖于facbookUsersSignal
。可以这样做:
- (RACSignal *)applicationUsersSignalWithFacebookUsersSignal:(RACSignal *)fbSignal
{
return [fbSignal flattenMap:^RACStream *(NSArray *facebookUsers) {
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// Do what you have to do with the facebookUsers
return nil;
}];
}];
}
只是为答案增加一点。我假设那些是冷信号,(尚未开始的信号尚未订阅)。因此,使用combineLatest:
的想法是,您希望捕获每个单个信号发送至少一个next
,after that you subscribe to it so it can begin的点。最后,您可以从RACTuple
获取其值。
我重读了你的问题,你希望它们全部都在一个数组中:
[[[RACSignal combineLatest:@[connectUsersSignal,facebookUsersSignal,applicationUsersSignal]] map:^id(RACTuple *allArrays) {
return [allArrays.rac_sequence foldLeftWithStart:[NSMutableArray array] reduce:^id(id accumulator, id value) {
[accumulator addObjectsFromArray:value];
return accumulator;
}];
}] subscribeNext:^(NSArray *allUsers) {
// Do Something
}];