CoreData + SwiftUI
ここで元の記事が見られます
最近、 SwiftUIとCoreDataを使用してアプリを構築する必要がありました。
CoreData は UIKit とほぼ同じように使用されると思っていましたが、どうやらいくつかの違いがあるようです。
このガイドは、CoreData と SwiftUI を組み合わせて使用した私の経験を要約することを目的としています。他の側面を見つけた場合は、このガイドに追加します。
それでは、さっそく始めましょう。
設定
これは非常に簡単な部分です。
- 新しいプロジェクトを開始する場合は、「 Use Core Data 」オプションをチェックし、ユーザーデータをクラウドに保存する場合は「Host in CloudKit 」をチェックします。この場合、XCode がプロジェクトのセットアップを処理します。(CloudKit 部分については、追加の手順を実行する必要があります)。
- すでにプロジェクトがある場合は、 Persistence.swiftファイルと、CoreData スタックを初期化する Swift ファイルを作成する必要があります。(前の手順に従って新しいプロジェクトを作成し、 XCode によって生成されたPersistence.swiftファイルをプロジェクトにコピーすることもできます。
managedObjectContextプロジェクトが完成したので、ビュー内で CoreData を使用できるようにするには、ビュー階層を下位に渡す必要があります。
通常、これは[appname]App.swiftファイルで行われます。
PersistenceController (ここに例があります) は、「Use Core Data」オプションをチェックして新しいプロジェクトを開始するときに XCode が自動的に生成する構造体です。
@main
struct ExampleApp: App {
let persistenceController = PersistenceController.shared
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(persistenceController)
.environment(\.managedObjectContext, persistenceController.container.viewContext)
}
}
}
これで、ビュー内で NSManagedObject を作成、読み取り、更新、削除できるようになりました。
CoreData での操作
CoreData を操作するには、NSManatedObjectContext にアクセスする必要があります。これを行うには、次の 2 つのオプションがあります。
- ビューでの @Environment ラッパーの使用
@Environment(\.managedObjectContext) private var viewContext
@EnvironmentObject private var persistenceController: PersistenceController
do {
if container.viewContext.hasChanges {
try container.viewContext.save()
}
} catch {
print(error)
}
NSManagedObject を保存するには、まずインスタンスを作成し、次にそのプロパティを設定する必要があります。そしてコンテキストを保存します。
let note = Note(context: container.viewContext)
note.id = id
note.text = text
note.folder = folder
note.creationDate = Date()
saveContext()
オブジェクトのフェッチ
さて、取得の部分ですが、これが私が最も困難を感じた場所です。すぐに始めましょう。
SwiftUI でオブジェクトをフェッチするには、CoreData から読み取る必要があるすべての単一ビューで@FetchRequestまたは@SectionedFetchRequestラッパーを使用するのが最も便利な方法です。
フェッチされたオブジェクトをビュー間で受け渡すと、オブジェクトを追加、編集、または削除する場合に自動更新が中断されます。(更新を中断せずにフェッチオブジェクトを渡す方法を知っている場合は、お知らせください。このガイドを更新します)
したがって、CoreData オブジェクトと自動更新が必要なすべてのビューに@FetchRequestを追加する必要があります。少し面倒だとは思いますが、それだけの価値はあります。
つまり、コードは次のとおりです。
@FetchRequest(entity: \Object.type,
sortDescriptors: [NSSortDescriptor],
predicate: NSPredicate,
animation: .default)
var objects: [Object]
@SectionedFetchRequest(entity: \Object.type,
sectionIdentifier: \Object.property,
sortDescriptors: [NSSortDescriptor],
predicate: NSPredicate,
animation: .default)
var sections: SectionedFetchResults<YourSectionType, Object>
List(sections) { section in
Section(section.id) {
ForEach(section) { object in
// Configure your view with the object
}
}
}
@FetchRequestまたは@SectionedFetchRequestを使用してオブジェクトを追加、更新、または削除すると、ビューが自動的に更新されます。
ここで、親ビューから渡されたパラメーターを持つNSPredicateで@FetchRequest を使用する必要がある場合、次のオプションがうまく機能することがわかりました。
@FetchRequest
var objects: FetchedResults<Object>
init(id: ID) {
_objects = FetchRequest<Object>(predicate: NSPredicate(format: "id == %@", id))
}
オブジェクトの更新
を更新するには、更新する を前述のようにNSManagedObject取得して、そのプロパティを更新する必要があります。NSManagedObjectそしてコンテキストを保存します。
note.text = newText
note.folder = newFolder
saveContext()
を削除するには、を更新し、前述したように取得して削除するNSManagedObject必要があります。NSManagedObject
viewContext.delete(object)
結論
SwiftUI で使用される CoreData についてこれまでに発見したのはこれだけです。このガイドは常に更新されます。
何かを行うためのより良い方法を提案したい場合は、コメントを残してください。最適なオプションでこのガイドを更新します。
SwiftUI と iOS の開発に取り組む皆さんのお役に立てれば幸いです。
この記事が気に入ったら、拍手を残してください。本当に感謝しています。
次のガイドでお会いしましょう!
私の仕事をサポートし、このガイドの実際の動作を確認したい場合は、BrainDump — Notes & Writingをチェックしてください。
ありがとうございます

![とにかく、リンクリストとは何ですか?[パート1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































