ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
SwiftDataへの移行
あなたのアプリでSwiftDataを使い始める方法を模索しましょう。既存のCore Dataオブジェクトモデルからモデルクラスを生成するためにXcodeを使用する方法、以前の実装と一緒にSwiftDataを使用する方法、あるいは既存のソリューションを完全に置き換える方法を紹介します。 このセッションを見る前に、"Meet SwiftData "を確認してください。
関連する章
- 0:00 - Intro
- 1:06 - Generate model classes
- 3:05 - Complete adoption
- 6:43 - Coexists with Core Data
- 10:47 - Wrap-up
リソース
関連ビデオ
WWDC23
-
ダウンロード
♪ ♪
あなたのCore Dataアプリを Core Dataと共存できる Swiftネイティブの永続化 フレームワークのSwiftDataに 移行する方法を共有できることを 嬉しく思います Core DataからSwiftDataへの 完全な移行の準備ができているか またはSwiftDataを段階的に採用し Core Dataと共存したいのか どうかに関わらず Core Dataアプリに SwiftDataを採用する方法の 一般的な使用例を取り上げます 最初にマネージドオブジェクトモデル エディタアシスタントを使用して SwiftDataモデルクラスを 生成する方法を説明します それから既存のCore Data アプリケーションに SwiftDataを採用する流れを示します 最後にSwiftDataへの完全な移行が あなたのアプリにとって 実現可能な解決策ではない場合のために Core DataとSwiftDataの 共存について紹介します まずモデル・クラスを生成する方法の 流れを説明します SwiftDataでは スキーマを設定するために コードでモデルを定義する かたちになります これを行う1つの簡単な方法は SwiftDataモデルを生成するために Core Dataのマネージドオブジェクトモデルを 使用することです ではこの移行方法について説明します 私はここでSampleTripsという ユーザーの今後の旅行の旅程を 計画に役立つCore Data アプリケーションを作成しました これがモデルファイルで 私のデータとその構成に関する情報が 含まれています 私はTrip宿泊施設バケツリストの エンティティを持っており 各トリップには 対応する生活宿泊施設と 希望する旅行のアクティビティを表す バケットリストの項目が 構成されています ここからこの同じ情報をキャプチャする SwiftDataクラスを生成します Core Dataの マネージドオブジェクトモデルは SwiftDataクラスを作成するために 必要ではありませんが 既存のCore Dataモデルを 持っている場合 すでに既存のモデルで持っている 情報に基づいて SwiftDataクラスを生成するために それを使用することができます そのために マネージドオブジェクトモデル エディタアシスタントを使います モデルファイルを選択した後 メニューバーに移動し Editorを選択し Create SwiftData Codeを クリックします これで ファイルを 生成できるようになりました ゼロからSwiftDataモデルを作成は 新しいSwiftアプリを作成する場合の このアシスタントは必須ではありません これが作成されたファイルです Swiftの型は Modelに準拠して Trip の名前 目的地 開始日と終了日 他のエンティティである宿泊施設と バケツリストとの関係である 属性を含む変数として エンティティの情報を取得します それでは、SwiftDataの完全な 採用プロセスをお見せしましょう アプリケーションを完全に SwiftDataに移行する場合 Core Dataスタックを 完全にSwiftDataスタックに 置き換えることになります これで データを永続化するコードが より見やすくなり いくつかの機能を 暗黙的に管理できるようになります しかしこの移行を行う前に 既存のCore Data モデルの設計が どのような構造になっているかを 検討する必要があります Core Data モデルの設計は エンティティやそのプロパティ リレーションシップを含む スキーマを参照します Core Data モデルの設計が SwiftDataでも サポートされていることを 確認する必要があります これはCore Dataで定義された 各々のエンティティに対して SwiftDataのエンティティ名と プロパティが完全に一致する モデルタイプが 必要であることを意味します すべての機能がSwiftDataで サポートされていることを確認するために モデルを徹底的にテストしてください Core Dataアプリからの完全な SwiftData採用プロセスの 特徴をもう少し詳しく 説明しましょう 私はすでにモデルをキャプチャのために Swiftの型を生成しました これらのファイルを準備できたら 以前使用していたCore Dataの管理 オブジェクトモデルファイルを削除し 代わりにこれらのSwiftファイルを通して モデルを管理することができます さらに以前Core Dataスタックの セットアップに役立った Persistenceファイルを 削除することもできます これでSwiftDataスタック用の modelContainerを 設定できるようになりました modelContainerはグループ内の 全てのウィンドウが同じ永続コンテナに アクセスするように構成されることを 保証するmodifierです このコンテナをTripsAppに 追加することで コンテナとコンテキストの両方を セットアップすることができます ModelContextはアプリのインスタンスの 変更を追跡するために使用されます この環境プロパティを使ってどのシーンや ビューからも読み取ることができます 私のSwiftDataのSampleTrips用の 永続的なスタックは セットアップされましたが いくつかの変更が必要です まず最初に オブジェクトの生成が どのように行われるかを示します 以前はコアデータで新しいトリップを 作成する場合この手順で行ってました Tripのインスタンスを作成し その属性を設定する前に 管理オブジェクトコンテキストを渡します SwiftDataではこのコードの行で Tripの新しいインスタンスを 作成することができ 比較的読みやすくなっています この新しいトリップを手に入れたら それをモデル・コンテキストに入力し 確実に永続化します 私のトリップが永続化されたので それを保存する方法と 将来そのトリップに加える変更を 検討したいです SwiftData には暗黙の保存機能があり UI ライフサイクルイベントと可能であれば コンテキストが変更された後の タイマーで保存をトリガーします したがってCore Dataの 明示的な保存を削除し コンテキストが変更されたときに 暗黙的な保存に頼って データを永続化することができます では私がどのようにデータを 取得するのかを説明します Core Dataのように フェッチリクエストを使う代わりに Queryでトリップの配列をラップして 今後のトリップの全リストを フェッチすることができるのです これによって トリップオブジェクト SwiftDataコンテナから取得できます またクエリのソート順も 定義しています 旅行開始日の順で並べ替えたいです 旅行開始日を前方順に並べ替え 最も近い旅行が一番上に来るようにしましょう クエリはPredicateを含む 必要があるユースケースとなります Core DataアプリをSwiftDataに 完全に移行する方法がわかったところで Core DataとSwiftDataを 共存させたい場合について 説明しましょう 完全な移行は必ずその場合 SwiftDataへの 部分的な変換を 検討することができます Core Dataスタックと SwiftDataスタックという 2つに分離された永続的なスタックが 同じ永続的なストアに 接続している状態です つまり SwiftDataのコードを 追加するために 既存のCore Dataのコードを完全に 書き直す必要がないということです アプリへSwiftDataを採用するときに すでにCore Dataが いくつかのデータを持っているか SwiftDataに完全に 移行することができない 他の制約に直面しているかにかかわらず より柔軟性を提供します このように両方のスタックを同じストアに 接続するように設定することができます 永続ストアをロードする前に container descriptionに 永続ストアURLを設定し 両方のスタックが同じ URL に 書き込まれるようにする必要があります さらに永続的な履歴追跡を オンにする必要があります 一方SwiftDataは自動的に 永続的な履歴追跡をオンにします Core Dataは例外です 永続的な履歴を設定することなく 同じアプリケーションにCore Dataと SwiftDataの両方が、 共存しているときに 永続的なストアを開こうとすると ストアは読み込み専用モードになります あなたのユースケースにとって 共存が最良の選択肢となるシナリオが いくつかあります 一つの選択肢は既存クライアントと 後方互換性を確保することです SwiftDataはiOS 17と macOS Sonomaでしか利用できないからです 現在のCore Dataアプリケーションは SwiftDataへの完全な切り替えで 影響を受ける可能性があります あるいはSwiftDataへの完全な 変換を困難にする リソースの制約に 直面するかもしれません このような場合には次のようなものを 組み込むのが理にかなっています SwiftDataを使用して 新しい開発を行うかアプリの一部だけ SwiftDataに変換することで部分的に SwiftDataを使用することができます Core DataとSwiftDataを 共存させるために この移行を行う前に考慮すべき いくつかの要件があります 最初に既存のNSManagedObject ベースのエンティティサブクラスか SwiftData 名前空間にして クラスを衝突しないように注意します つまり2つのクラスが同じものと 呼ばれることはなく 少なくともどちらか一方を 変更する必要です クラス名を変更してもエンティティ名は 変わらないことに注意してください ここでは前と同じ SampleTripsプロジェクトをつかいますが 今回はCore Dataと SwiftDataを共存させたいのです この2つのクラス名がややこしいです SwiftDataとCore Dataの 両方の名前を区別するために Core Dataトリップ クラス名を CDTripに変更しました これはModel Editorでも可能です Core Dataを保持する必要があります SwiftDataのスキーマを同期させ SwiftData スキーマの新しい部分は マネージドオブジェクトモデルとして 実体化されなければならず 2つのスキーマが分岐することはありません つまりプロパティとリレーションシップは まったく同じ方法で モデルに追加されなければ ならないのです これはエンティティのバージョン・ ハッシュ の一致化のためです ハッシュの不一致は マイグレーションを引き起こし 必要な情報を削除してしまうかも しれないからです 最後に共存を取り入れる際には スキーマのバージョンを 把握しておく必要があります SwiftDataモデルの複数のバージョンを 扱うとき SwiftDataが違いを評価できるよう 変更が正しく表現されていることを 確認する必要があります これにはいくつかの方法があります バージョン管理されたスキーマの使い方を 理解するため 「Model your schema with SwiftData」を チェックしてください UIKitまたはAppKitに依存する Swiftアプリのために SwiftDataを使用する実行可能な オプションがまだあります 最初のアプローチ は 共存ソリューションです UIKitのコードをCore Dataに バインドでき SwiftDataと並行して 動作することができます 代わりにSwiftDataクラスを Swiftクラスとして扱い 代わりにUIKitコードでSwiftコードを ラップもできます 私からは以上です! さあ柔軟なマイグレーションを 体験してみましょう Core DataアプリをSwiftDataに 完全移行か段階的に移行します その間にSwiftDataについて より深く知るために これらの他のクールな講演を チェックしてください 参加してくれてありがとう! 何を作ってくれるのか楽しみ! ♪ ♪
-
-
4:37 - Creating a ModelContainer in SwiftUI
@main struct TripsApp: App { var body: some Scene { WindowGroup { ContentView() } .modelContainer( for: [Trip.self, BucketListItem.self, LivingAccommodation.self] ) } }
-
4:57 - Object creation in Core Data
@Environment(\.managedObjectContext) private var viewContext let newTrip = Trip(context: viewContext) newTrip.name = name newTrip.destination = destination newTrip.startDate = startDate newTrip.endDate = endDate
-
5:30 - Object creation in SwiftData
@Environment(\.modelContext) private var modelContext let trip = Trip( name: name, destination: destination, startDate: startDate, endDate: endDate ) modelContext.insert(object: trip)
-
6:16 - Fetch with Query in SwiftData
@Query(sort: \.startDate, order: .forward) var trips: [Trip]
-
7:30 - Setting store path and enabling persistent history tracking in Core Data
let url = URL(fileURLWithPath: "/path/to/Trips.store") if let description = container.persistentStoreDescriptions.first { description.url = url description.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey) }
-
9:11 - Ensuring Core Data and SwiftData class names are unique
class CDTrip: NSManagedObject { // ... } @Model final class Trip { // ... }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。