何时应该/必须将ReactiveCocoa对象声明/实例化为存储的属性而不是本地变量



(适用于ReactiveCocoa 4或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

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

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

一个常见的做法是保留MutablePropertyprivate,只暴露一个可读的:

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

相关内容

  • 没有找到相关文章

最新更新