ReactiveCocoa flattenMap не вызывается

У меня есть два источника данных, которые вытягивают различные массивы как "Контакты" и "Пользователи", так и совокупный источник данных Invitee, который создается для объединения и сохранения ссылок на результаты контактов и пользователей:

AddressBookDataSource:

- (RACSignal *)getContacts {
 return [[[[self getContactsSignal] flattenMap:^RACStream *(NSArray *contacts) {
 return contacts.rac_sequence.signal;
 }]
 map:^id(APContact *contact) {
 return [[Contact alloc] initWithAPContact:contact];
 }] collect];;
}

- (RACSignal*)getContactsSignal {
 APAddressBook *addressBook = [[APAddressBook alloc] init];
 addressBook.fieldsMask = APContactFieldFirstName | APContactFieldCompositeName | APContactFieldPhoto;
 RACSignal *addressBookSignal = [RACSignal createSignal:^RACDisposable *(id<racsubscriber> subscriber) {
 [addressBook loadContacts:^(NSArray *contacts, NSError *error) {
 if (error) {
 [subscriber sendError:error];
 } else {
 [subscriber sendNext:contacts];
 }
 }];
 return nil;
 }];
 return addressBookSignal;
}
</racsubscriber>

ParseDataSource:

- (RACSignal *)getUsers {
 return [[[[[self getUsersSignal] flattenMap:^RACStream *(NSArray *users) {
 return users.rac_sequence.signal;
 }] filter:^BOOL(User *user) {
 return ![user.username isEqualToString:[User currentUser].username];
 }] map:^id(User *user) {
 return user;
 }] collect];
}

- (RACSignal*)getUsersSignal {
 RACSignal *getUsersSignal = [RACSignal createSignal:^RACDisposable *(id<racsubscriber> subscriber) {
 PFQuery *userQuery = [User query];
 [userQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
 if (error) {
 [subscriber sendError:error];
 } else {
 [subscriber sendNext:objects];
 }
 }];
 return nil;
 }];

 return getUsersSignal;
}
</racsubscriber>

InviteeDataSource:

- (RACSignal*)getPotentialInvitees {
 ParseDataSource *parseDataSource = [[ParseDataSource alloc] init];
 AddressBookDataSource *addressBookDataSource = [[AddressBookDataSource alloc] init];

 return [[RACSignal concat:@[
 [parseDataSource getUsers],
 [addressBookDataSource getContacts]
 ]]
 flattenMap:^RACSignal *(RACTuple *tuple) {
 RACTupleUnpack(NSArray *users, NSArray *contacts) = tuple;
 _contactSection.contacts = contacts;
 _userSection.users = users;
 return [RACSignal empty];
 }];
}

Проблема в том, что блок flattenMap никогда не flattenMap, а это означает, что последующие подписчики никогда не будут вызывать свои subscribeNext блоки flattenMap.

Помогите?

1 ответ

Благодаря ответу twitter от @jspahrsummers было несколько вещей, которые делали это не так, как хотелось бы, но корень проблемы состоял в том, что я не вызывал -sendCompleted на подписчика в -getUsersSignal и -getContactsSignal.

licensed under cc by-sa 3.0 with attribution.