SwiftDataのトランザクション

2.6K Views

June 01, 24

スライド概要

MobileAct Osaka #13 登壇資料
2024/05/31

profile-image

Fenrir-Inc. iOS Engineer.

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

SwiftDataってトランザクション 使えるんですか?

2.

すみません、わかりません。

3.

SwiftDataのトランザクション autosaveのミニ検証 rila

4.

Rila Fenrir の iOSエンジニア

5.

SwiftData

6.

SwiftData • データ永続化のフレームワーク • CoreDataの後継者 • SQLの仕組みで永続化するのはCoreDataと同じ • Swift macro など駆使してSwiftコードだけで完結 • 逆に言うとコードベースに落とし込むことで自由度がないとも言えそう • (実感したことはない)

7.

トランザクション

8.

トランザクション • 複数の処理をひとまとまりにして、どれかひとつでも失敗したら全部の処理 をなかったことにする • ModelContextのインスタンスメソッドにある • throwされると、保留にしていた変更は勝手にロールバックする

9.

フルーツ在庫管理・購入履歴 トランザクションのユースケース 1.フルーツを購入する 1.フルーツの在庫を購入した個数分減らす 2.購入履歴にいつ、何のフルーツを、何個買ったかを記録する

10.

つくってみる

11.

開発環境 • Xcode 15.2 • SwiftUI • MacOS • 開発したころはVenturaのどれか • スライド作成したときにはSonomaにしてしまってわからなくなりました

12.

できた トランザクションのコード

13.

なんやむっちゃ簡単やん

14.

autosaveEnabled

15.

autosaveEnabled ModelContext • そもそもModelContextは2段階 • ローカルで変更を保留→ストレージに保存 • CoreDataでは save() してはじめてストレージに保存 • こういうときとりあえず保存しといたるわ!な設定 • モデルを挿入・変更・削除したとき • Window・scene・view・sheetのライフサイクルの様々な場面

16.

様々な場面っていつやねん…

17.

フルーツ詳細で在庫数を変更 オレンジマンは イラスト屋さんから 拝借しました🙏

18.

Printいっぱい書いた • 🐺:view のいろいろ • 各 View の body • 各 View の on appear • TextField の editing イベント • 🍎:model context will save • 🍏:model context did save

19.

saveを呼び出すタイミング • アプリ起動して画面が表示された直後 • newChangeTokenなるものが保存されていた • Text did begin editing • キーボード表示されてまだ値を編集していない段階 • ストレージの値との間に差分はないはずなのに、saveが呼び出されていた • Text did change • 1文字でも変更されたら都度呼ばれる

20.

感想 autosaveEnabled • 暗黙的な保存は予測不可能でちょっと怖い • 「完了」ボタンをトリガーにしてストレージに反映したいときとかは autosave切った方がいい • ちなみに、どこから初期化されたかでデフォルト値が変わる • main context(@Query, environment変数のModelContext) は true • 自分でModelContainerを渡して初期化すると false

21.

LINE 公式アカウントはじめました。 採用に関するお問い合わせや相談など 「友だち追加」でお気軽に。 @fenrir̲recruit

22.

公 式 L INEや ってます 友 だち登 録後 のお願 い あ ては ま る方 を タ ップ お 願い し ます

23.

公 式 L INEや ってます 友 だち登 録後の お 願 い ① ② あては まる方 を タップ お願い します M obi l e A c t と 送信 く ださ い