也许我仍然在反应学习曲线上挣扎,但我很难弄清楚如何将非反应性类与我的其他反应性代码连接起来。我使用一个类别来扩展非反应性类。
该属性只是一个Enum,表示网络操作的当前状态,如New、Submitted、Processing和Completed。现在,我已经在我的类别中编写了以下方法:
@implementation JRequestBase (RACExtensions)
- (RACSignal*) rac_RequestStateSignal
{
return RACAble(self, state);
}
@end但是,当状态从处理->完成或从任何状态转换到Errored时,我希望这个信号发送已完成或错误,而不是下一个值。我怎样才能在一个类别中做到这一点呢?我想做这样的事情:
@implementation JRequestBase (RACExtensions)
- (RACSignal*) rac_RequestStateSignal
{
return [RACAble(self, state) map:^(NSNumber *state){
if ([state intValue] == iRequestStateComplete)
{
# SEND COMPLETE
}
else if ([state intValue] == iRequestStateErrored)
{
# SEND ERROR
}
else
{
return state;
}
}];
}
@end编辑:我查看了GHAPIDemo并提出了以下内容:
- (RACSignal*) rac_RequestSignal
{
RACSubject *subject = [[RACReplaySubject alloc] init];
[[RACAble(self, state) subscribeNext:^(NSNumber* s){
if ( [s intValue] == JRequestStateCompleted)
{
[subject sendNext:self];
[subject sendCompleted];
}
else if ([s intValue] == JRequestStateErrored)
{
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
// .. Set up dict with necessary values.
NSError *error = [NSError errorWithDomain:@"blah" code:1 userInfo:dict];
[subject sendError:error];
}
}];
return subject;
}我不是百分之百肯定这是正确的方式,但它似乎是有效的。
发布于 2013-09-13 17:53:44
无论何时要映射值-flattenMap:信号事件,而不是值→值,都应该使用→返回与每个输入值对应的信号。然后,正如名字中的“扁平”所暗示的,它们将被组合成一个产生的信号。
但是,这种情况有点不同,因为您希望在获得Complete值后立即终止信号。我们将使用-takeUntilBlock:来表示该部分。
生成的代码如下所示:
- (RACSignal*) rac_RequestStateSignal
{
return [[RACObserve(self, state)
takeUntilBlock:^ BOOL (NSNumber *state){
return [state intValue] == iRequestStateComplete;
}]
flattenMap:^(NSNumber *state){
if ([state intValue] == iRequestStateErrored)
{
// Create a meaningful NSError here if you can.
return [RACSignal error:nil];
}
else
{
return [RACSignal return:state];
}
}];
}(我使用RACObserve是因为https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/CHANGELOG.md#20现在是唯一受支持的版本,但是您可以使用RACAble,直到准备好升级为止。)
通常情况下,您应该使用avoid using subjects when possible,因为它们使代码更有状态并减少了懒惰。
https://stackoverflow.com/questions/18788331
复制相似问题