---
title: SwiftDataのトランザクション
tags: 
author: [rila](https://www.docswell.com/user/rila______)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/5EG3K6N57L.jpg?width=480
description: MobileAct Osaka #13 登壇資料 2024/05/31
published: June 01, 24
canonical: https://www.docswell.com/s/rila______/ZNR4X7-2024-05-31-MobileAct-13
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/5EG3K6N57L.jpg)

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


# Page. 2

![Page Image](https://bcdn.docswell.com/page/4JQ5N4QL7P.jpg)

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


# Page. 3

![Page Image](https://bcdn.docswell.com/page/K749GQN5E1.jpg)

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


# Page. 4

![Page Image](https://bcdn.docswell.com/page/LJ1KDP527G.jpg)

Rila
Fenrir の iOSエンジニア


# Page. 5

![Page Image](https://bcdn.docswell.com/page/GJWDY25272.jpg)

SwiftData


# Page. 6

![Page Image](https://bcdn.docswell.com/page/4EZGXDN4J3.jpg)

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


# Page. 7

![Page Image](https://bcdn.docswell.com/page/Y76Y418GEV.jpg)

トランザクション


# Page. 8

![Page Image](https://bcdn.docswell.com/page/G75GQ49X74.jpg)

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


# Page. 9

![Page Image](https://bcdn.docswell.com/page/9J2YPV2QJR.jpg)

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


# Page. 10

![Page Image](https://bcdn.docswell.com/page/DEYG53YYEM.jpg)

つくってみる


# Page. 11

![Page Image](https://bcdn.docswell.com/page/VJNGNVPR78.jpg)

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


# Page. 12

![Page Image](https://bcdn.docswell.com/page/YE9WR63ZE3.jpg)

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


# Page. 13

![Page Image](https://bcdn.docswell.com/page/GE8NWZLY7D.jpg)

なんやむっちゃ簡単やん


# Page. 14

![Page Image](https://bcdn.docswell.com/page/LELPNDL97R.jpg)

autosaveEnabled


# Page. 15

![Page Image](https://bcdn.docswell.com/page/4JM4XPMV7W.jpg)

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


# Page. 16

![Page Image](https://bcdn.docswell.com/page/PJRWN1VW79.jpg)

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


# Page. 17

![Page Image](https://bcdn.docswell.com/page/PEXPNYZV7X.jpg)

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


# Page. 18

![Page Image](https://bcdn.docswell.com/page/3EKDN385JD.jpg)

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


# Page. 19

![Page Image](https://bcdn.docswell.com/page/L73RVG21J5.jpg)

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


# Page. 20

![Page Image](https://bcdn.docswell.com/page/87DY81ZK7G.jpg)

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


# Page. 21

![Page Image](https://bcdn.docswell.com/page/VJP68QD3E8.jpg)

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


# Page. 22

![Page Image](https://bcdn.docswell.com/page/2EV3N51N7Q.jpg)

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


# Page. 23

![Page Image](https://bcdn.docswell.com/page/57G3K625JL.jpg)

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


