如何用 ReactiveCocoa 完成这个
How to Accomplish this w/ ReactiveCocoa
我正在构建一个功能,我的应用程序的用户可以找到他们的 Facebook 好友并将他们添加到应用程序中。我必须执行三个步骤:
- 获取当前连接的用户
- 获取 Facebook 用户
- 获取应用程序用户(这取决于步骤 2)
一旦所有这些都完成,我就需要 combine/reduce 将三个结果数组放入最终数组。
我创建了三个函数,所有 return RACSignal
getUsersWithFacebookIds
、getConnectedUsers
和 getFacebookUsers
我不确定如何使用 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:
的想法是您想要捕获每个信号发送至少一个 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
}];
我正在构建一个功能,我的应用程序的用户可以找到他们的 Facebook 好友并将他们添加到应用程序中。我必须执行三个步骤:
- 获取当前连接的用户
- 获取 Facebook 用户
- 获取应用程序用户(这取决于步骤 2)
一旦所有这些都完成,我就需要 combine/reduce 将三个结果数组放入最终数组。
我创建了三个函数,所有 return RACSignal
getUsersWithFacebookIds
、getConnectedUsers
和 getFacebookUsers
我不确定如何使用 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:
的想法是您想要捕获每个信号发送至少一个 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
}];