ReactiveSwift(下)

SignalProducer

SignalProducer是Reactive斯维夫特中冷信号的落实, 是第③种发送事件的途径.

        热信号是移动着的事件发生器, 相对应的,
冷信号则是休眠中的事件时有发生器. 也等于说冷信号必要1个指示操作,
然后才能发送事件, 而那些提示操作就是订阅它. 因为订阅后才发送事件, 明显,
冷信号不存在时机早晚的题材. 仍以春晚举例:

        冷信号也就是春晚的视频文件而不是现场直播, 不荒谬处境下,
摄像文件肯定是不会自动播放的, 但你如果一双击,
它就被运转广播然后输出节目了.

//1. 通过SignalProducer.init(startHandler: (Observer, Lifetime) -> Void)创建SignalProducer

let producer = SignalProducer { (innerObserver, lifetime) in

lifetime.observeEnded({

print(“信号无效了 你可以在此地展开部分清理工作”)

})

//2. 向外界发送事件

innerObserver.send(value: 1)

innerObserver.send(value: 2)

innerObserver.sendCompleted()

}

//3. 创办一个观看者封装事件处理逻辑

let outerObserver = Signal.Observer(value: { (value) in

print(“did received value: (value)”)

})

//4. 添加观望者到SignalProducer

producer.start(outerObserver)

房地产项目,输出: did received value: 1

did received value: 2

信号无效了 你能够在此地举办部分清理工作

typealias Producer = ReactiveSwift.SignalProducer

let producer = Producer { (innerObserver, _) in

//没什么想清理的

innerObserver.send(value: 1)

innerObserver.send(value: 2)

innerObserver.sendCompleted()

}

producer.startWithValues { (value) in

print(“did received value: (value)”)

}

producer.startWithFailed(action: )

producer.startWithResult(action: )

producer.startWithXXX…各样方便函数

和Signal的订阅格局如出一辙, 只是名字换了一下,
Signal.observeXXX换到了SignalProducer.startXXX.

            都是事件发生器,
所以API方面Signal和SignalProducer都以一样的,地方的map, on, merge,
comblinelast…等等, SignalProducer也有一份, 成效也都一样
,
作者就不多说了, 那里大约给两段代码说说大概遇见的坑

func fetchData(completionHandler: (Int, Error?) -> ()) {

print(“发起网络请求”)

completionHandler(1, nil)

}

let producer = Producer {[unowned self] (innerObserver, _) in

self.fetchData(completionHandler: { (data, error) in

innerObserver.send(value: data)

innerObserver.sendCompleted()

})

}

producer.startWithValues { (value) in

print(“did received value: (value)”)

}

producer.startWithValues { (value) in

print(“did received value: (value)”)

}

出口: 发起互连网请求

did received value: 1

提倡互联网请求

did received value: 1

莫不你只是想三个观望者共享五次互连网请求带回的伊夫nt,
但事实上那里会发生两遍网络请求, 但那不是三个bug, 那是二个feature.

SignalProducer的贰个特点是,
每趟被订阅就会进行五回起初化时保留的闭包.

就此假如你有近似三次执行, 多处订阅的需求,
你应有接纳Signal而不是SignalProducer. 所以, 符合须求的代码只怕是那样:

let signalTuple = NSignal.pipe()

signalTuple.output.observeValues { (value) in

print(“did received value: (value)”)

}

signalTuple.output.observeValues { (value) in

print(“did received value: (value)”)

}

self.fetchData { (data, error) in

signalTuple.input.send(value: data)

signalTuple.input.sendCompleted()

}

输出: 发起网络请求

did received value: 1

did received value: 1

            到如今截止, 示例代码中给到的都以NoError类型的信号,
在其实付出中, 那显明是不能够的, 终归错误是不可逆袭的.
平日我们的类型会声Bellamy(Aptamil)个接近APIError的不当类型来表示那一个错误,
所以你只怕会有如此的讲明:    

structAPIError: Swift.Error {

let code: Int

var reason =””

}

typealias NSignal = ReactiveSwift.Signaltypealias 

 APISignal = ReactiveSwift.Signaltypealias

 Producer = ReactiveSwift.SignalProducertypealias

 APIProducer = ReactiveSwift.SignalProducer

诸如此类的扬言很好, 能让ReactiveSwift写起来像卡宴XSwift一样”简洁”.
但那里须求充分上边的代码才能更好的做事:

extension SignalProducer where Error == APIError {

@discardableResult

func startWithValues(_ action: @escaping (Value) -> Void) -> Disposable {

returnstart(Signal.Observer(value: action))

}

}

        那是因为暗许的SignalProducer是不曾startWithValues函数的,
Reactive斯维夫特会在Extension里给它助长startWithValues函数,
不过那只对NoError有效, 所以当你在自定义Error时, 请记得加上类似的代码.  
 

相关文章