7

UAGitHubEngine用来访问 GitHub 的 API。我想编写一个功能性的反应式应用程序来获取一些数据。我依靠这里的代码来设置异步网络请求。我正在寻找的是一些名为“General”的团队的团队 ID。我可以做过滤/打印部分OK:

[[self.gitHubSignal filter:^BOOL(NSDictionary *team) {
    NSString *teamName = [team valueForKey:@"name"];
    return [teamName isEqualToString:@"General"];
}] subscribeNext:^(NSDictionary *team) {

    NSInteger teamID = [[team valueForKey:@"id"] intValue];

    NSLog(@"Team ID: %lu", teamID);
}];

但是设置命令对我来说是个谜:

self.gitHubCommand = [RACCommand command];

self.gitHubSignal = [self.gitHubCommand addSignalBlock:^RACSignal *(id value) {
    RACSignal *signal = ???

    return signal;
}];

如何设置信号块以在某些异步网络调用返回时返回推送事件的信号?

4

1 回答 1

4

答案在 中RACReplaySubjectAFNetworking 使用它来包装它的异步请求。

self.gitHubCommand = [RACCommand command];

self.gitHubSignals = [self.gitHubCommand addSignalBlock:^RACSignal *(id value) {
    RACReplaySubject *subject = [RACReplaySubject subject];

    [engine teamsInOrganization:kOrganizationName withSuccess:^(id result) {

        for (NSDictionary *team in result)
        {
            [subject sendNext:team];
        }

        [subject sendCompleted];            
    } failure:^(NSError *error) {
        [subject sendError:error];
    }];

    return subject;
}];

由于addSignalBlock:返回一个信号信号,我们需要订阅它发出的下一个信号。

[self.gitHubSignals subscribeNext:^(id signal) {
    [signal subscribeNext:^(NSDictionary *team) {
        NSInteger teamID = [[team valueForKey:@"id"] intValue];

        NSLog(@"Team ID: %lu", teamID);
    }];
}];

最后,在addSignalBlock:执行命令之前不会执行该块,我使用以下命令进行管理:

[self.gitHubCommand execute:[NSNull null]];
于 2013-04-02T18:24:37.200 回答