RACSignal地图有错误

时间:2015-04-07 23:12:54

标签: ios json reactive-programming reactive-cocoa

我有一个简单的问题,但我无法找到一个很好的解决方案。

我有一个发送字符串的信号,后面有一个mapmap将字符串转换为JSON。

可能会发生字符串格式错误且JSON解析器无法解析错误。

[stringGeneratorSignal map:^(NSString *bussinessObjectString){
    NSError *error;
    BussinessObject *obj = [[BussinessObject alloc] initWithString:bussinessObjectString error:&error];
    if (error) {
        NSLog(@"%@", error);
    }
    return obj;
}];

但是因为我在地图内部,我无法返回错误信号。我想要的是获得解析器提供的错误的错误。

我已经分析了一些我不喜欢的可能性:

  • 在地图中返回错误,然后有一个实际将数据(或错误)转换为错误信号的包装器信号。问题是我委托了同样的问题(将数据转换为错误信号)。
  • 请改用flattenMap。这将允许返回错误消息,但问题是它与map的行为不同。

这种情况的最佳方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

看看-tryMap。它允许您返回数据或nil,然后设置错误

/// Runs `mapBlock` against each of the receiver's values, mapping values until
/// `mapBlock` returns nil, or the receiver completes.
///
/// mapBlock - An action to map each of the receiver's values. The block should
///            return a non-nil value to indicate that the action was successful.
///            This block must not be nil.
///
/// Example:
///
///   // The returned signal will send an error if data cannot be read from
///   // `fileURL`.
///   [signal tryMap:^(NSURL *fileURL, NSError **errorPtr) {
///       return [NSData dataWithContentsOfURL:fileURL options:0 error:errorPtr];
///   }];
///
/// Returns a signal which transforms all the values of the receiver. If
/// `mapBlock` returns nil for any value, the returned signal will error using
/// the `NSError` passed out from the block.
- (RACSignal *)tryMap:(id (^)(id value, NSError **errorPtr))mapBlock;