Карта RACsignal с ошибкой

У меня есть простой вопрос, но я не могу найти на него хорошее решение.

У меня есть сигнал, который отправляет строки, и map после него. map преобразует строки в JSON.

Может случиться так, что строка имеет неправильный формат, и анализатор JSON не сможет выполнить синтаксический анализ с ошибкой.

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

Но поскольку я нахожусь внутри карты, я не могу вернуть сигнал об ошибке. Я хотел бы получить ошибку с ошибкой, предоставленной синтаксическим анализатором.

Несколько возможностей, которые я проанализировал, которые мне не нравятся:

  • Верните ошибку на карту, а затем получите сигнал-оболочку, который фактически преобразует данные (или ошибку) в сигнал ошибки. Проблема в том, что я делегирую ту же задачу (преобразование данных в сигнал ошибки).
  • Вместо этого используйте flattenMap. Это позволит вернуть сообщение об ошибке, но проблема в том, что это не то же поведение, что и map.

Каков наилучший подход для такого рода сценариев?

Спасибо!


person 7ynk3r    schedule 07.04.2015    source источник


Ответы (1)


Посмотрите на -tryMap. Это позволяет вам вернуть данные или ноль, а затем установить ошибку

/// 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;
person Chris Morse    schedule 08.04.2015