😎

SwiftUIのObservable Objectを利用した再描画の分離

2022/05/11に公開

問題

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