Я искал простой способ автоматического обновления пользовательского интерфейса при обновлении переменной. Регулярный KVO - это очень грязный код, поэтому я смотрел RxSwift, ReactiveCocoa и т. Д., Но обнаружил, что их трудно понять, и много новых объектов и слишком много вещей, которые мне не нужны.Неправильная ли практика вызова необязательной функции внутри hasSet переменной?
Я играл с переменным didSet
вместе с дополнительной опцией emtpy в моем объекте. Надеюсь, это проще показать, чем объяснить:
Пользовательская объект (ViewModel)
class AwesomeViewModel{
var awesomeText:String { didSet { updateBlock?() } }
var updateBlock:(()->())?
init(awesomeText:String){
self.awesomeText = awesomeText
}
}
И пользовательские UIView:
class AwesomeView:UIView{
@IBOutlet weak var awesomeLabel: UILabel!
func bindViewModel(viewModel:AwesomeViewModel){
viewModel.updateBlock = { [weak self] in
self?.awesomeLabel.text = viewModel.awesomeText
}
viewModel.updateBlock?()
}
}
Давайте говорить об этом настраиваемое представление AwesomeView
существует в UIViewController
как выход. Создаю экземпляр AwesomeViewModel
, а затем позвоните self.awesomeView.bindViewModel(awesomeViewModel)
.
Когда я позже, в моем UIViewController
(или где-нибудь еще, если на то пошло, он может быть передан вокруг) сделать что-то вроде awesomeViewModel.awesomeText = "Hello World"
, то didSet переменной в ViewModel будет инициировать дополнительную функцию updateBlock
. Поскольку эта функция задана пользовательским представлением AwesomeView
, она автоматически обновит текст в метке в этом представлении.
Я думал, что это было довольно круто, и легко понять, но есть ли какие-либо побочные эффекты этого или что-то я не вижу? Это плохая практика? Это кажется намного проще, чем при использовании стандартного КВО со всеми функциями и наблюдения и т.д ..
Я думал об использовании этого для UITableViewCell
-х, где bindViewModel()
назвали бы в cellForRowAtIndexPath
. Я не думаю, что есть какие-либо циклы сохранения или что-то еще, но я не так хорош в их обнаружении.
Я надеялся получить некоторые плюсы и минусы по этому методу, прежде чем применять его только к своему приложению чтобы узнать, что это самая глупая идея в мире. Но для меня это нормально.
Самый большой недостаток по сравнению с KVO заключается в том, что он не является зернистым (что может быть хорошо для ваших нужд). Если ваша модель имеет несколько свойств и один «updateBlock», вы никогда не знаете, что было фактически обновлено, только что-то было обновлено. – rmaddy