什么时候/我必须声明/实例化ReactiveCocoa对象作为存储属性与局部变量?

时间:2015-12-04 02:38:39

标签: reactive-cocoa reactive-cocoa-3 racsignal

(适用于ReactiveCocoa 4或3)

在我看到的大多数示例和案例中,ReactiveCocoa MutableProperty<TVal, TErr>对象(如SignalProducer<TVal, TErr>setupBindings所涉及的用户界面与数据的连接至少在某些{{1}中实例化或者在构造函数中调用的类似方法。

我遇到过几种情况,当我将对象的声明从作用域移动到存储属性时,我的非工作代码突然“正常工作”,反之亦然。例如,在伪代码中:

class Wtf {

    // doesn't work

    init() {
        let prop = MutableProperty<Dah, Dah>()...
        doSomethingWith(prop)
    }

    // also doesn't work

    private let prop: MutableProperty<Dah, Dah> = MutableProperty<Dah, Dah>(Dah())

    init() {
        doSomethingWith(prop)
    }    

    // works?

    private let prop: MutableProperty<Dah, Dah>

    init() {
        prop = MutableProperty<Dah, Dah>(Dah())
        doSomethingWith(prop)
    }
}

所以似乎有几个基本问​​题。

给出一些ReactiveCocoa对象......

  1. 我应该何时将声明作为属性(letvar)与本地实例变量?
  2. 我应该何时实例化它作为存储,计算或其他属性变体与实例
  3. 什么时候应该是一个函数return

1 个答案:

答案 0 :(得分:0)

MutablePropertyclass。换句话说:它具有引用语义。 与Signal(其生命周期depends on a termination event)不同,property的生命周期由所有者定义。如果没有对象持有对属性的引用,则将对其进行解除分配。

因此,您的问题的答案通常是将其存储在另一个类中。

常见的做法是保留MutableProperty private,只展示一个可读的:

final class Owner {
    private let mutableProperty = MutableProperty<Type?>(nil)
    public var property: AnyProperty<Type?> {
        return AnyProperty(self.mutableProperty)
    }
}