😎
SwiftUIのObservable Objectを利用した再描画の分離
問題
SwiftUIでObservableObject
を作成すると@Published
が付与されたメンバーが更新されるたびにwillChangedが発行されて観測しているViewがそれぞれ再描画されます。2つのViewがあった場合に,片方の再描画が重たいと画面が固まってしまいます。
そのため描画の分離を行いたいです。
解決策
一つの巨大なオブジェクトを作成してそのメンバにObservedObject
をもたせることで変更通知の分離ができました。また,Bindingを利用して依存関係を使うことで変更通知を飛ばさずに別のパラメータを更新できました。
struct QueryView: View {
@StateObject var model: QueryViewModel
}
final class QueryViewModel: ObservableObject {
@ObservedObject var code: CodeViewModel
@ObservedObject var output: QueryOutputViewModel
init(code: CodeViewModel, output: QueryOutputViewModel) {
self.code = code
self.output = output
self.code.setup(result: self.$output.result)
}
}
final class CodeViewModel: ObservableObject {
@Published var query: String = "****"
var result: Binding<String>!
func setup(result: Binding<String>) {
self.result = result
}
}
final class QueryOutputViewModel: ObservableObject {
@Published var result: String = "No Output"
}
Discussion