如何使用ReactiveCocoa完成此操作

时间:2015-04-16 20:13:11

标签: ios swift reactive-cocoa

我正在建立一个功能,我的应用程序的用户可以找到他们的Facebook好友并将其添加到应用程序中。我需要做三个步骤:

  1. 获取当前连接的用户
  2. 获取Facebook用户
  3. 获取应用程序用户(这取决于步骤2)
  4. 一旦完成所有这些,我就需要将三个结果数组合并/减少到最终数组中。

    我创建了三个都返回RACSignal

    的函数

    getUsersWithFacebookIdsgetConnectedUsersgetFacebookUsers

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

    enter image description here

1 个答案:

答案 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:的想法是,您希望捕获每个单个信号发送至少一个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
}];