2013-04-02 66 views
7

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

[[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

答案在RACReplaySubject,其中AFNetworking uses包装其异步请求。

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