Avatar
Kishikawa Katsumi 3/13/2018 3:56 AM
最近関わりを持ったプロジェクトで、Model、ViewModel、ViewControllerがあり、それぞれModelの変更をViewModelが、ViewModelの変更をViewControllerが監視していて、ReactiveCocoaによってバインディングされています。 ViewModelの変更によって呼ばれるメソッドがちょっと長くて、 func updateTableView() { ... tableView.reloadData() // 1 ... tableView.scrollTo(latestIndexPath) // 2 ... } のようになっています。
3:56 AM
このとき、(おそらく)1と2の間にModelが更新されて、2のメソッド呼び出しでIndexPathが合わなくてクラッシュするということが起こっています。 (おそらく、と書いたのは再現できたわけじゃないけど、コードを見る限りそうとしか思えない。)
3:56 AM
updateTableView()はメインスレッドで呼ばれるけど、Modelの変更はバックグラウンドスレッドで頻繁に変更される。
3:57 AM
私はViewModelをイミュータブルにして、変更通知と変更通知の間で変わらないようにすべし(変更通知のたびにイミュータブルなViewModelを生成して渡す)、とアドバイスしたのですが、他に良い方法ありますか?