将 Reactive Cocoa SignalProducer 转换为枚举

Transform Reactive Cocoa SignalProducer into enum

我正在尝试将我的 API SignalProducers 转换为枚举,以便我获得正在加载、失败和已加载状态。枚举是:

enum DataLoadState<DataType>{
    case Loading
    case Failed
    case Loaded(DataType)
}

为此,我将 SignalProducer 转换为 NoError 生产者并从加载状态开始:

extension SignalProducerType{
    func materializeToLoadState() -> SignalProducer<DataLoadState<Value>,NoError>{
        let producer = self
        .map(DataLoadState.Loaded)
        .startWithValue(DataLoadState.Loading)

        return producer.ignoreErrors(replacementValue:DataLoadState<Value>.Failed)
    }
}

extension SignalProducerType {

    func startWithValue(value:Value)->SignalProducer<Value,Error>{
        return SignalProducer(value:value).concat(self.producer)
    }

    public func ignoreErrors(replacementValue replacementValue: Self.Value? = nil) -> SignalProducer<Self.Value, NoError> {
        return self.flatMapError { error in
            return replacementValue.map(SignalProducer.init) ?? .empty
        }
    }
}

它有效,但我不想忽略错误,而是想将它包含在失败的案例中:

enum DataLoadState<DataType>{
    case Loading
    case Failed(APIError?)
    case Loaded(DataType)
}

关于如何使用 flatMapError(如在 ignoreError 中)以便将错误作为 DataLoadState.Failed(error) 触发而不是被忽略的任何想法?当不显示错误时,错误可能只是零。有可能吗?

好的,用以下方式修复它:

producer.flatMapError { error in SignalProducer(value:.Failed(error as? APIError)) }