🐥

【SwiftData】@Query で大量データをカウントする - バックグラウンドの進捗状況

2024/07/02に公開

バックグラウンドから、10万件のデータを挿入するとして、

その挿入件数を @Query で監視してライブで UI に反映したいですよね。

しかし、10万件くらい大きくなると重い。

ProgressView や % 表示などで使えます。

シンプルなデータで試します。

@Model
final class Item {
  var i: Int
  var s: String

  init(i: Int, s: String) {
    self.i = i
    self.s = s
  }
}

重さは fetch する量に関係しているようなので最大で1つだけ fetch します。

バックグラウンドでデータベースに値が追加されると

@Query で取得する zo は変化してないように見えるのですが、

内部的には変化しているのでしょう。

以下でライブにカウントできる。

private static var fetchDescriptor: FetchDescriptor<Item> {
  var fd = FetchDescriptor<Item>()
  fd.fetchLimit = 1
  return fd
}

@Query(fetchDescriptor)  private var zo: [Item]

private var count: Int {
  zo.isEmpty ? 0 : try! modelContext.fetchCount(FetchDescriptor<Item>())
}

これで ModelContext.fetchCount() を Observe しながら使うことができます

🤔 参考

https://x.com/maochanz/status/1806282787319882171

Discussion