2.7K Views
June 01, 24
スライド概要
MobileAct Osaka #13 登壇資料
2024/05/31
Fenrir-Inc. iOS Engineer.
SwiftDataってトランザクション 使えるんですか?
すみません、わかりません。
SwiftDataのトランザクション autosaveのミニ検証 rila
Rila Fenrir の iOSエンジニア
SwiftData
SwiftData • データ永続化のフレームワーク • CoreDataの後継者 • SQLの仕組みで永続化するのはCoreDataと同じ • Swift macro など駆使してSwiftコードだけで完結 • 逆に言うとコードベースに落とし込むことで自由度がないとも言えそう • (実感したことはない)
トランザクション
トランザクション • 複数の処理をひとまとまりにして、どれかひとつでも失敗したら全部の処理 をなかったことにする • ModelContextのインスタンスメソッドにある • throwされると、保留にしていた変更は勝手にロールバックする
フルーツ在庫管理・購入履歴 トランザクションのユースケース 1.フルーツを購入する 1.フルーツの在庫を購入した個数分減らす 2.購入履歴にいつ、何のフルーツを、何個買ったかを記録する
つくってみる
開発環境 • Xcode 15.2 • SwiftUI • MacOS • 開発したころはVenturaのどれか • スライド作成したときにはSonomaにしてしまってわからなくなりました
できた トランザクションのコード
なんやむっちゃ簡単やん
autosaveEnabled
autosaveEnabled ModelContext • そもそもModelContextは2段階 • ローカルで変更を保留→ストレージに保存 • CoreDataでは save() してはじめてストレージに保存 • こういうときとりあえず保存しといたるわ!な設定 • モデルを挿入・変更・削除したとき • Window・scene・view・sheetのライフサイクルの様々な場面
様々な場面っていつやねん…
フルーツ詳細で在庫数を変更 オレンジマンは イラスト屋さんから 拝借しました🙏
Printいっぱい書いた • 🐺:view のいろいろ • 各 View の body • 各 View の on appear • TextField の editing イベント • 🍎:model context will save • 🍏:model context did save
saveを呼び出すタイミング • アプリ起動して画面が表示された直後 • newChangeTokenなるものが保存されていた • Text did begin editing • キーボード表示されてまだ値を編集していない段階 • ストレージの値との間に差分はないはずなのに、saveが呼び出されていた • Text did change • 1文字でも変更されたら都度呼ばれる
感想 autosaveEnabled • 暗黙的な保存は予測不可能でちょっと怖い • 「完了」ボタンをトリガーにしてストレージに反映したいときとかは autosave切った方がいい • ちなみに、どこから初期化されたかでデフォルト値が変わる • main context(@Query, environment変数のModelContext) は true • 自分でModelContainerを渡して初期化すると false
LINE 公式アカウントはじめました。 採用に関するお問い合わせや相談など 「友だち追加」でお気軽に。 @fenrir̲recruit
公 式 L INEや ってます 友 だち登 録後 のお願 い あ ては ま る方 を タ ップ お 願い し ます
公 式 L INEや ってます 友 だち登 録後の お 願 い ① ② あては まる方 を タップ お願い します M obi l e A c t と 送信 く ださ い