swift - 将响应式(Reactive) Cocoa SignalProducer 转换为枚举

标签 swift enums reactive-cocoa

我正在尝试将 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)) }

关于swift - 将响应式(Reactive) Cocoa SignalProducer 转换为枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38097958/

相关文章:

c# - 通过枚举或关系表定义数据状态

ios - 在我的 ReactiveCocoa 测试项目中了解 ReactiveCocoa 和 MVVM

ios - ReactiveCocoa - 忽略所有值

ios - 在 PageViewController 中打开特定的 View Controller

c - C语言中 'enum'的值是如何存储的?

ios - 将数据从 UITableView 单元格传输到另一个 VC 的 tableview? ( swift )

c++ - 为什么将枚举声明标记为 const?

ios - 在MVVM模型中使用Reactive Cocoa的iOS应用程序是否会比MVC模型中的普通应用程序消耗更多功率?

ios - 在我滚动之前 UICollectionView 没有完全加载

ios - 在 uipickerview 选择或文本字段输入后隐藏或显示元素