【问题标题】:ReactiveCocoa flattenMap not calledReactiveCocoa flattenMap 未调用
【发布时间】:2015-02-23 09:40:42
【问题描述】:

我有两个数据源正在拉入不同的联系人和用户数组,以及一个聚合的受邀者数据源,该数据源是为了组合和保留对联系人和用户结果的引用而创建的:

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

解析数据源:

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

受邀者数据源:

- (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 块永远不会被调用,这意味着后续订阅者永远不会调用他们的subscribeNext 块。

帮助?

【问题讨论】:

  • 你能提供getContactsSignal吗?
  • @siejkowski 刚刚在其中添加了它。
  • 你确定你 sendNext 并且不 sendError 吗? IE。 flattenMap 中是否有结果需要处理?

标签: ios objective-c functional-programming reactive-cocoa frp


【解决方案1】:

感谢@jspahrsummers 的推特回复,有几件事导致它的行为不像我想要的那样,但问题的根源似乎是我没有在订阅者上调用-sendCompleted -getUsersSignal-getContactsSignal

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    相关资源
    最近更新 更多