2016-06-29 44 views
0

Ich versuche, meine API SignalProducer in eine Enumeration zu transformieren, so bekomme ich Laden, fehlgeschlagen und geladenen Staaten. Enum ist:Reactive Cocoa SignalProducer in Enum transformieren

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

es tun ich meine SignalProducer zu einem NoError Produzenten verwandeln und beginnen mit Ladezustand:

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 
     } 
    } 
} 

Es funktioniert, aber ich möchte nicht, Fehler ignorieren, sondern ich will in dem ausgefallenen Fall sind es:

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

Jede Idee, wie kann ich flatMapError (wie in ignoreError) so Fehler wie DataLoadState.Failed (Fehler) ausgelöst werden, anstatt ignoriert zu werden? Wenn der Fehler nicht angezeigt wird, kann der Fehler nur Null sein. Ist es überhaupt möglich?

Antwort

0

Ok, regelte es nur mit:

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