Когда следует / нужно объявить / создать объекты 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. Когда я должен объявить это как собственность (let или же var) vs локальная переменная экземпляра?
  2. Когда я должен создавать его экземпляр как хранимый, вычисляемый или другой вариант свойства по сравнению с экземпляром
  3. Когда это должно быть функцией return?

1 ответ

MutableProperty это class, Другими словами: у него есть ссылочная семантика. В отличие от Signal (чье время жизни зависит от события завершения), время жизни property определяется владельцем. Если ни один объект не содержит ссылку на свойство, оно будет освобождено.

По этой причине ответ на ваш вопрос, как правило, будет хранить его внутри другого класса.

Обычное дело - сохранять MutablePropertyprivateи выставить только читабельный:

final class Owner {
    private let mutableProperty = MutableProperty<Type?>(nil)
    public var property: AnyProperty<Type?> {
        return AnyProperty(self.mutableProperty)
    }
}
Другие вопросы по тегам