我翻译的RAC4的文档:
ReactiveCocoa 4 官方文档翻译
ReactiveCocoa 4 文档翻译:基本操作符(一)
ReactiveCocoa 4 文档翻译:基本操作符(二)
ReactiveCocoa 4 文档翻译:框架组成介绍
ReactiveCocoa 4 文档翻译:兼容Objective-C
ReactiveCocoa 4 文档翻译–设计指南(一):事件的规范
ReactiveCocoa 4 文档翻译:设计指南(二):信号的规范
[翻译]ReactiveCocoa 4 最佳实践
从RAC 3.0引入全新的设计时,也考虑和RAC2的最大兼容性,好让升级不会那么痛苦。可以通过RAC提供的桥接函数将OC的类型转换成swift类型来调用RAC2的API。
因为和RAC2的底层设计完全不同,转换并不总是能做到一一对应,但是我们保证了两个框架的核心概念是一致的。
转换的类型有:
- RACSignal 和 SignalProducer、 Signal
- RACCommand 和 Action
- RACScheduler 和 SchedulerType
- RACDisposable 和 Disposable
对如果要查询全部的桥接API,查看这个文件: ObjectiveCBridging.swift
。如果要查看怎么从RAC2升级,查看这份文档:CHANGELOG.
RACSignal 和 SignalProducer、 Signal
在RAC3后,冷信号表示为<code> SignalProducer </code>类型,热信号表示表示为<code> Signal </code>类型。
冷信号<code> RACSignal </code>可以通过<code> toSignalProducer </code>方法转换为<code> SignalProducer </code>。
<pre><code>
extension RACSignal {
func toSignalProducer() -> SignalProducer<AnyObject?, NSError>
}
</code></pre>
热的<code> RACSignal </code>不能直接转换成<code> Signal </code>,因为RACSignal的订阅者可能有副作用。如果要获得Signal,使用<code> RACSignal.toSignalProducer </code>,接着调用<code> SignalProducer.start </code>,可以显性的发现潜在的副作用。
其他情况下下,用<code> toRACSignal() </code>函数。
当用SignalProducer调用时,这些函数会创建一个RACSignal,然后为每个订阅者调用一次<code>start()</code>:
<pre><code>
func toRACSignal<T: AnyObject, E>(producer: SignalProducer<T, E>) -> RACSignal
func toRACSignal<T: AnyObject, E>(producer: SignalProducer<T?, E>) -> RACSignal
</code></pre>
当用Signal调用时,这些函数会创建一个RACSignal,然后只是简单的观察它:
<pre><code>
func toRACSignal<T: AnyObject, E>(signal: Signal<T, E>) -> RACSignal
func toRACSignal<T: AnyObject, E>(signal: Signal<T?, E>) -> RACSignal
</code></pre>
RACCommand 和 Action
要将<code>RACCommand</code>转换为新的<code> Action </code>类型,使用<code>toAction()</code>扩展方法:
<pre><code>
extension RACCommand {
func toAction() -> Action<AnyObject?, AnyObject?, NSError>
}
</code></pre>
使用<code>toRACCommand()</code>函数将<code>Action</code>转换为<code>RACCommand</code>:
<pre><code>
func toRACCommand<Output: AnyObject, E>(action: Action<AnyObject, Output, E>) -> RACCommand
func toRACCommand<Output: AnyObject, E>(action: Action<AnyObject?, Output, E>) -> RACCommand
</code></pre>
注意:action和command的<code> executing </code>属性不会通过通过桥接API同步。
RACScheduler 和 SchedulerType
每个<code> RACScheduler </code>实例都会自动转为<code> DateSchedulerType </code>(<code> SchedulerType </code>的一种类型),可以在函数方法里自由传递。
有些RAC的<code> SchedulerType </code>类型不能转为<code> RACScheduler </code>实例,使用<code> toRACScheduler() </code>方法:
<pre><code>
extension ImmediateScheduler {
func toRACScheduler() -> RACScheduler
}
extension UIScheduler {
func toRACScheduler() -> RACScheduler
}
extension QueueScheduler {
func toRACScheduler() -> RACScheduler
}
</code></pre>
RACDisposable 和 Disposable
每个<code> RACDisposable </code>实例都会自动转为<code> Disposable </code>,可以在要求是<code> RACDisposable </code>类型的地方直接使用。
虽然不能自动把Disposable转换为RACDisposable,但是可以手动轻松实现:
<pre><code>
let swiftDisposable: Disposable
let objcDisposable = RACDisposable {
swiftDisposable.dispose()
}
</code></pre>
欢迎关注我的微博:@没故事的卓同学