1

(适用于ReactiveCocoa4 或 3)

在我见过的大多数示例和案例中,将用户界面连接到数据中所涉及的ReactiveCocoa对象至少在构造函数中调用的某个或类似方法中MutableProperty<TVal, TErr>实例化。SignalProducer<TVal, TErr>setupBindings

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

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
4

1 回答 1

0

MutableProperty是一个class。换句话说:它具有引用语义。与Signal(其生命周期取决于终止事件)不同, a 的生命周期property由所有者定义。如果没有对象持有对属性的引用,它将被释放。

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

一个常见的做法是保留MutableProperty private, 并且只公开一个可读的:

final class Owner {
    private let mutableProperty = MutableProperty<Type?>(nil)
    public var property: AnyProperty<Type?> {
        return AnyProperty(self.mutableProperty)
    }
}
于 2015-12-05T02:02:29.450 回答