如何用 ReactiveCocoa 完成这个

How to Accomplish this w/ ReactiveCocoa

我正在构建一个功能,我的应用程序的用户可以找到他们的 Facebook 好友并将他们添加到应用程序中。我必须执行三个步骤:

  1. 获取当前连接的用户
  2. 获取 Facebook 用户
  3. 获取应用程序用户(这取决于步骤 2)

一旦所有这些都完成,我就需要 combine/reduce 将三个结果数组放入最终数组。

我创建了三个函数,所有 return RACSignal

getUsersWithFacebookIdsgetConnectedUsersgetFacebookUsers

我不确定如何使用 ReactiveCocoa 连接所有这些。

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: 的想法是您想要捕获每个信号发送至少一个 nextafter 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
}];