ReactiveCocoa 4 文档翻译:兼容Objective-C

原文:Objective-C Bridging

我翻译的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>
欢迎关注我的微博:@没故事的卓同学

    原文作者:没故事的卓同学
    原文地址: https://www.jianshu.com/p/15d8dac12360
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞