Когда следует / нужно объявить / создать объекты 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
объект...
- Когда я должен объявить это как собственность (
let
или жеvar
) vs локальная переменная экземпляра? - Когда я должен создавать его экземпляр как хранимый, вычисляемый или другой вариант свойства по сравнению с экземпляром
- Когда это должно быть функцией
return
?
1 ответ
MutableProperty
это class
, Другими словами: у него есть ссылочная семантика. В отличие от Signal
(чье время жизни зависит от события завершения), время жизни property
определяется владельцем. Если ни один объект не содержит ссылку на свойство, оно будет освобождено.
По этой причине ответ на ваш вопрос, как правило, будет хранить его внутри другого класса.
Обычное дело - сохранять MutableProperty
private
и выставить только читабельный:
final class Owner {
private let mutableProperty = MutableProperty<Type?>(nil)
public var property: AnyProperty<Type?> {
return AnyProperty(self.mutableProperty)
}
}