繁体   English   中英

我何时/必须将ReactiveCocoa对象声明/实例化为存储的属性而不是局部变量?

[英]When should/must I declare/instantiate ReactiveCocoa objects as stored properties versus local variables?

(适用于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的生命周期由所有者定义。 如果没有对象持有对属性的引用,则将其释放。

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

常见的做法是将MutableProperty private ,并且只公开可读的内容:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM