31. Transport Layer + RAC
let requestAction = Action<URLRequest, URLResponse, Error> { .../*future task*/ }
let http = Action<Request, Response, Error> { request in
return Result<Request, Error>(value: request)
.flatMap(serialize) //Result<JSON, Error>
.flatMap(requestBuilder(forConfiguration: configuration)) //Result<URLRequest, Error>
.map(SignalProducer.init) //SignalProducer<URLRequest, Error>
.flatMap(.Latest, transform: requestAction.apply) //SignalProducer<URLResponse, Error>
.attemptMap(deserialize) //SignalProducer<Response Error
}
Заметьте - эта штука вполне может
быть общей вне зависимости от
входных и выходных данных засчет
generic
32. Build Your Own RAC
extension SignalType {
/// Returns a signal that will yield an array of values when `self` completes.
@warn_unused_result(message="Did you forget to call `observe` on the signal?")
public func collect() -> Signal<[Value], Error> {
return self
.reduce(CollectState()) { $0.append($1) }
.map { $0.values }
}
}
33. Transport Layer + RAC
let httpWithPolicy = Action<Request, Response, Error> { request in
http.apply(request)
.retry(3)
.suspendOn(enterBackgroundSignal: background, enterForeground: foreground)
}
39. Model Layer + RAC
struct State {
let number: Int
let value: AnyProperty<ImageWithDescription?>
init(number: Int) {
self.number = number
self.value = AnyProperty(value: nil, producer: service.apply(number))
}
}
let state = MutableProperty(State(number: 100))
let increment = { number.value = State(number: number.value.number + 1) }
let exposedState = AnyProperty(state)