mjn*_*n12 8 objective-c reactive-cocoa
也许我仍然在反应性学习曲线上挣扎,但我很难弄清楚如何将非反应类与其他反应代码联系起来.我正在使用一个类别来扩展非反应类.
该属性只是一个Enum,表示网络操作的当前状态,如New,Submitted,Processing和Completed.现在我在我的类别中写了以下方法:
@implementation JRequestBase (RACExtensions)
- (RACSignal*) rac_RequestStateSignal
{
return RACAble(self, state);
}
@end
Run Code Online (Sandbox Code Playgroud)
但是,当状态从Processing - > Completed或从任何状态转换为Errored时,我希望此信号发送Completed或Error而不是Next Value.我怎样才能在一个类别中实现这一目标?我想做的事情如下:
@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
Run Code Online (Sandbox Code Playgroud)
编辑:我看了一下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;
}
Run Code Online (Sandbox Code Playgroud)
我不是百分百肯定这是正确的方式,但似乎有效.
Jus*_*ers 11
无论何时想要映射值→信号事件而不是值→值,都应该使用-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];
}
}];
}
Run Code Online (Sandbox Code Playgroud)
(我使用过,RACObserve因为ReactiveCocoa 2.0现在是唯一受支持的版本,但您可以使用,RACAble直到您准备好升级.)
作为一般规则,您应该尽可能避免使用主题,因为它们使代码更有状态并减少懒惰.
| 归档时间: |
|
| 查看次数: |
3023 次 |
| 最近记录: |