使用RACCommand进行异步网络操作

我使用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;
}];

如何设置信号模块以返回一些在异步网络呼叫返回时推送事件的信号?


答案在RACReplaySubject ,AFNetworking用它来包装它的异步请求。

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: block不会被执行,直到命令被执行,我通过以下方式管理:

[self.gitHubCommand execute:[NSNull null]];
链接地址: http://www.djcxy.com/p/70469.html

上一篇: Use RACCommand with Asynchronous Network Operation

下一篇: Inspect webkit