🐥
【SwiftData】@Query で大量データをカウントする - バックグラウンドの進捗状況
バックグラウンドから、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 しながら使うことができます
🤔 参考
Discussion