2017-01-31 2 views
0

Мое приложение имеет область состояния вверху, которая показывает информацию о ходе работы (аналогичную Xcode и iTunes). Я хочу обновить его, введя побочные эффекты в поток событий, используя закрытие, которое преобразует значение потока в значение ProgressUpdate. Я использую расширение на SignalProducer, поэтому любой производитель сигналов в моем приложении может обновлять область состояния приложения (есть намного больше, чтобы задействовать сразу несколько сигналов, но это не влияет на эту проблему).генерирует побочный эффект в SignalProducer

Я основываю его на SignalProducer's (начало :, начато :, ...). Это требует последней быстрой версии 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

Typo? '.on (event: {(orignal)' вместо 'original' –

+0

, что плюс несколько других опечаток –

ответ

0

Похоже, что это была просто ошибка сообщения об ошибках от компилятора. Фактическая проблема заключалась в том, что process() должен принимать событие, а не закрытие, которое принимает событие. Также понадобилось пустое имя внешнего параметра.

Изменение подписи

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

и фиксируя оригинальный опечатка Майк Таверна указал, установил ее.

Смежные вопросы