一般在SignalProducer中注入副作用

时间:2017-01-31 22:53:12

标签: swift reactive-cocoa

我的应用在顶部有一个状态区域,显示进度信息(类似于Xcode和iTunes)。我想通过将副作用注入事件流来更新它,使用一个闭包将流的值转换为ProgressUpdate值。我在SignalProducer上使用了一个扩展程序,因此我的应用程序中的任何信号生成器都可以更新应用程序的状态区域(有更多涉及允许同时发出多个信号,但这不会影响这个问题)。

我基于SignalProducer' s开始:,开始:,...)。它需要最新的swift 3.1 beta来允许对错误类型进行约束,但这直接来自游乐场。

import ReactiveSwift

struct Rc2Error: Error {
}

struct ProgressUpdate {
    let message: String
    let value: Double = -1
}

class MacAppStatus {
    fileprivate func process(event: (Event<ProgressUpdate, Rc2Error>) -> Void) 
    {
        //update UI based on the event
    }
}


extension SignalProducer where Error == Rc2Error {
    func updateProgress<Value>(status: MacAppStatus, converter: @escaping (Value) -> ProgressUpdate) -> SignalProducer<Value, Error>
    {
        return SignalProducer<Value, Error> { observer, compositeDisposable in
            self.startWithSignal { signal, disposable in
                compositeDisposable += disposable
                compositeDisposable += signal
                    .on(event: { (orignal) in
                        switch original {
                        case .completed:
                            status.process(Event<ProgressUpdate, Rc2Error>.completed)
                        case .interrupted:
                            status.process(Event<ProgressUpdate, Rc2Error>.interrupted)
                        case .failed(let err):
                            status.process(Event<ProgressUpdate, Rc2Error>.failed(err))
                        case .value(let val):
                            status.process(Event<ProgressUpdate, Rc2Error>.value(converter(val)))
                        }
                    })
                    .observe(observer)
            }
        }
    }
}

```

.observe(observer)的最后一行产生错误:

error: cannot convert value of type 'Observer<Value, Rc2Error>' to expected argument type 'Observer<_, Rc2Error>'

为什么这种转换失败的任何想法?有关完成此任务的不同方法的建议吗?

1 个答案:

答案 0 :(得分:0)

看起来这只是来自编译器的错误报告。实际问题是process()应该采用Event,而不是采用事件的闭包。它还需要一个空的外部参数名称。

将签名更改为

    fileprivate func process(_ event: Event<ProgressUpdate, Rc2Error>) 

并修复原始错误Mike Taverne指出修复它。