UI スレッドをブロックしてるんですよね。
10万レコードのような大きいデータを fetch()
すると。
バックグラウンドで大量インサートなどしながら、
UI側でリストなどをスクロールするともっと顕著に分かります。
どうやら、
「インスタンス生成をどこで行うか」
が大事なようです。
singleton の ModelActor
側。
@ModelActor
actor DataSource {
nonisolated(unsafe) private(set) static var shared: DataSource!
// static func createInstance(modelContainer: ModelContainer) {
// print("createInstance()", Thread.current) // main
// shared = DataSource(modelContainer: modelContainer)
// }
static func createInstance(modelContainer: ModelContainer) async {
print("createInstance()", Thread.current) // not main
shared = DataSource(modelContainer: modelContainer)
}
View
側。インスタンス生成はバックグラウンドで。
// .onAppear { // main
// DataSource.createInstance(modelContainer: modelContext.container)
// }
.task { // not main
await DataSource.createInstance(modelContainer: modelContext.container)
}
どうなんすかね。
SwiftData も苦しんでる感じに見えます。
関連ワード: apple・iOS・iPhone・mac・macOS・Swift・SwiftData・SwiftUI・今さら聞けない・初心者・評判・開発