【SwiftUI】TextField サンプルコード

自在に書けそうで書けない TextField

カスタムスタイルを使うより、

そのまま View メソッドのチェインと入れ子で

記述したほうが自在でわかりやすように思います。




SwiftUI を使う限り常に使うコードですので、

気に入った記述があれば、

Gist と共にメモとして更新していきたいです。



【SwiftData】バックグラウンドで @ModelActor を singleton で使う

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 も苦しんでる感じに見えます。

👉 SwiftData does not work on a background Task even inside a custom ModelActor. | Apple Developer Forums hatena-bookmark


【Swift】Apple 公式サンプル にみる @ModelActor を singleton にして ViewModifier にすると便利

 

🤔 @ModelActor の使い方

👉 【SwiftUI】SwiftData でスレッドセーフにバックグラウンドでデータを扱う 🔄 - @ModelActor hatena-bookmark

少しおさらい的にまとめておきたい。

ModelContext は Non-Sendable。ModelContainer は Sendable。

nonisolated func はインスタンスから値のコピーをスナップショット的に切り出す。

 

🤔 方針


- Singleton で使う。

- ViewModifier として利用する View の onAppear でインスタンス生成。

 

🤔 コード

方針に合わせて、

ざっくりイメージとして下書き。



テンプレートとして随時更新予定。

 

🤔 参考 (Apple 公式サンプルコード)

👉 sample-backyard-birds/Multiplatform/Shop/BirdBrain.swift at 1843d5655bf884b501e2889ad9862ec58978fdbe · apple/sample-backyard-birds hatena-bookmark
👉 sample-backyard-birds/BackyardBirdsData/General/BackyardBirdsDataContainer.swift at 1843d5655bf884b501e2889ad9862ec58978fdbe · apple/sample-backyard-birds hatena-bookmark