-
tryMap
RACSignal的一般用法是:
如果想对RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { [subscriber sendNext:@"我是发送的数据"]; [subscriber sendError:[NSError errorWithDomain:@"www.huang" code:0 userInfo:@{NSLocalizedDescriptionKey:@"错误信息"}]]; return nil; }]; [signal subscribeNext:^(id x) { NSLog(@"next:%@",x); } error:^(NSError *error) { NSLog(@"error:%@",error.localizedDescription); }]; --------- 打印结果: next:我是发送的数据 error:错误信息
subscriber
发送的数据进行一些处理(比如筛选符合预期的数据走next
回调,不符合预期的走error
回调),应该怎么操作呢?
此时RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { [subscriber sendNext:@"我是发送的数据"]; return nil; }]; [signal subscribeNext:^(id x) { NSLog(@"next:%@",x); } error:^(NSError *error) { NSLog(@"error:%@",error.localizedDescription); }];
tryMap
就能排上用场了RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { [subscriber sendNext:@"我是发送的数据"]; return nil; }]; RACSignal *newSignal = [signal tryMap:^id(id value, NSError *__autoreleasing *errorPtr) { if ([value isKindOfClass:[NSNumber class]]) { // 符合预期 返回原本的值 return value; } else { // 不符合预期,走error回调 NSError *error = [NSError errorWithDomain:@"www.huang" code:0 userInfo:@{NSLocalizedDescriptionKey:@"数据格式错误"}]; *errorPtr = error; // 这里一定要返回nil,相当于拦截了value的值,就不会走next回调了 return nil; } }]; // Note: 其实可以使用 tryMap 原来的value,并返回新的value给 next回调 [newSignal subscribeNext:^(id x) { NSLog(@"next:%@",x); } error:^(NSError *error) { NSLog(@"error:%@",error.localizedDescription); }]; --------- 打印结果: error:数据格式错误
-
try
与tryMap
不同,try
需要给定一个布尔值来决定subscriber
回调的执行逻辑。RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { [subscriber sendNext:@"我是发送的数据"]; return nil; }]; /** 返回值是一个BOOL 当返回YES时,subscriber 订阅时走next回调 当返回NO时,subscriber 订阅时走error回调 */ RACSignal *newSignal = [signal try:^BOOL(id value, NSError *__autoreleasing *errorPtr) { NSError *error = [NSError errorWithDomain:@"www.huang" code:0 userInfo:@{NSLocalizedDescriptionKey:@"数据格式错误"}]; *errorPtr = error; return NO; /** 这样并不能修改原来发送的value的值,因为这是形参!! value = @(1234); return YES; */ }]; [newSignal subscribeNext:^(id x) { NSLog(@"next:%@",x); } error:^(NSError *error) { NSLog(@"error:%@",error.localizedDescription); }]; --------- 打印结果: error:数据格式错误
-
源码
- (RACSignal *)try:(BOOL (^)(id value, NSError **errorPtr))tryBlock { NSCParameterAssert(tryBlock != NULL); return [[self flattenMap:^(id value) { NSError *error = nil; BOOL passed = tryBlock(value, &error); // 关键点 passed是否为YES return (passed ? [RACSignal return:value] : [RACSignal error:error]); }] setNameWithFormat:@"[%@] -try:", self.name]; } - (RACSignal *)tryMap:(id (^)(id value, NSError **errorPtr))mapBlock { NSCParameterAssert(mapBlock != NULL); return [[self flattenMap:^(id value) { NSError *error = nil; id mappedValue = mapBlock(value, &error); // 关键点: mappedValue是否为nil return (mappedValue == nil ? [RACSignal error:error] : [RACSignal return:mappedValue]); }] setNameWithFormat:@"[%@] -tryMap:", self.name]; }
tryMap和try
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 前言 不同于前面的几篇文章,在这个系列里,我会通过我以前的学习介绍一些常用的基本API的作用,集团的项目写的比较快...
- 1.ReactiveCocoa常见操作方法介绍。 1.1 ReactiveCocoa操作须知 所有的信号(RACS...