【Swift UIKit】UITableViewDiffableDataSourceの使い方!データの局所更新

この記事からわかること
- SwiftのUIKitでリストを実装する方法
- UITableViewを使った方法
- UITableViewDiffableDataSourceの使い方
index
[open]
\ アプリをリリースしました /
環境
- Xcode:16.0
- iOS:18.0
- Swift:5.9
- macOS:Sonoma 14.6.1
UITableViewDiffableDataSourceでできること
UIKitベースでリストビューを作成するときはUITableView
を使用するかと思います。しかし実装は意外と複雑かつセルのデータを更新する際もreloadData
を呼び出してテーブル全体をリフレッシュしたりとパフォーマンス的に少し懸念点が残る部分もあるかと思います。reloadRows
やreloadSections
で一部のみの更新を行うことも可能ですが、UITableViewDiffableDataSource
を使用することで比較的シンプルに冗長なリフレッシュのないリストビューを実装することが可能になっています。
NSDiffableDataSourceSnapshot
公式リファレンス:NSDiffableDataSourceSnapshot
UITableViewDiffableDataSource
で肝となるのがNSDiffableDataSourceSnapshot
です。「Diffable」→「差分可能」なこのデータソースはデータの差分のみを自動で更新対象に限定してくれます。従来通りにセクションとリストアイテムを管理することができるようになっています。
Hashableに準拠させる
NSDiffableDataSourceSnapshot
でセクションやアイテムとして管理するクラスはHashable
に準拠している必要があります。
実装の手順
- Hashableに準拠したデータ型の定義
- カスタムセルビューの定義
- UITableViewのベースを作成する
- 扱いやすいようにタイプエイリアスを作成
- データソースの設定
- データ更新処理の実装
- データの追加/削除を実装する
1.Hashableに準拠したデータ型の定義
これは先ほど定義したものを利用していきます。
2.カスタムセルビューの定義
リストに表示するためのカスタムセルビューを定義しておきます。ここは特に特別なことはしていません。
3.UITableViewのベースを作成する
続いてUITableViewのベースを作成しておきます。カスタムヘッダービューの作成やカスタムセルビューの連携などを行なっています。
4.扱いやすいようにタイプエイリアスを作成
使用するUITableViewDiffableDataSource
とNSDiffableDataSourceSnapshot
型は扱いやすいようにタイプエイリアスを作成しておきます。
5.データソースの設定
続いてtableView.dataSource
にUITableViewDiffableDataSource
を設定するための処理を記述します。configureDataSource
メソッドとして用意した部分でDataSource
型を作成しています。
6.データ更新処理の実装
最後に実際にデータを更新してUIに反映させる部分を実装します。NSDiffableDataSourceSnapshot<ProductCategory, Product>
型のインスタンスを生成しそこにデータをappendSections
/appendItems
を使用して格納します。追加が完了したらapply
メソッドで実際に反映させます。初回は全てのデータが更新されますが、2回目以降はデータの変更部分だけを自動で更新するように制限してくれます。
7.データの追加/削除を実装する
最後にデータを追加/削除する処理を追加しておきます。今回はナビゲーションに追加するのでNavigationViewController
を追加しておいてください。追加/削除を行った後は先ほど実装したapplySnapshot
メソッドを呼び出すだです。
全体のコード
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。