【问题标题】:When should/must I declare/instantiate ReactiveCocoa objects as stored properties versus local variables?我什么时候应该/必须将 ReactiveCocoa 对象声明/实例化为存储属性而不是局部变量?
【发布时间】:2016-03-08 21:29:06
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-07-28
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      • 2019-06-06
      • 2012-06-10
      • 1970-01-01
      相关资源
      最近更新 更多