私は、変数が更新されたときにUIを自動的に更新する簡単な方法を探していました。 Regular KVOはあまりにも面倒なコードなので、RxSwift、ReactiveCocoaなどを見てきましたが、これは把握が難しく、新しいオブジェクトがたくさんあり、必要のないものがたくさんありました。変数のdidSetの中にオプションの関数を呼び出すことは悪い習慣ですか?
変数の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"
ような何かを、その後のViewModelの変数のdidSetはオプション機能updateBlock
をトリガします。この機能はカスタムビューAwesomeView
によって設定されているため、そのビュー内のラベル内のテキストを自動的に更新します。
私はこれがかなりクールで理解しやすいと思っていましたが、これの副作用や私が見ていないものはありますか?それは悪い習慣ですか?それは私がbindViewModel()
がcellForRowAtIndexPath
で呼び出されますUITableViewCell
年代、のためにこれを使用して考えた
私はこのメソッドを私のアプリケーションに適用する前にいくつかの長所と短所を得ることを望んでいたそれが世界で最も愚かな考えであることを知るために。しかし私にはそれは大丈夫だと思われる。
KVOと比較して最大の欠点は、全く細かいことではありません(自分のニーズに合っているかもしれません)。モデルに複数のプロパティと1つの "updateBlock"がある場合、実際に何が更新されたのか分かりません。何かが更新されただけです。 – rmaddy