【问题标题】:How to Accomplish this w/ ReactiveCocoa如何使用 ReactiveCocoa 完成此任务
【发布时间】:2015-04-16 20:13:11
【问题描述】:

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

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

所有这些完成后,我需要将三个结果数组合并/减少为最终数组。

我创建了三个函数,它们都返回RACSignal

getUsersWithFacebookIdsgetConnectedUsersgetFacebookUsers

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

【问题讨论】:

    标签: ios swift reactive-cocoa


    【解决方案1】:

    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
    }];
    

    【讨论】:

    • 看来sn-p最后的代码可以使用combineLatest:reduce进行简化
    • @MichałCiuba 您将在combineLatest:reduce: 中获得 3 个数组,这与将所有 3 个数组合并为一个不同。
    • @RuiAAPeres 您可以使用combineLatest:reduce: 来避免allArrays.firstallArrays.second 等调用。但在这种情况下,您可以只从元组本身获取rac_sequence,而map 仍然是适当的操作。
    • @RuiAAPeres 我的意思是这样的:gist.github.com/mciuba/9e8c6f31408a336b3749。我做了一个简单的测试,它似乎在subscribeNext 块中发送与您的代码示例相同的数组。有什么我看不到的区别吗?
    • @MichałCiuba 该解决方案的问题在于,如果我有一个返回数组的新信号,reduce 将不会展平其元素。使用fold,您就没有这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多