以下示例代码,展示了如何将数据保存到 Core Data 并同步到 CloudKit:
import CoreData
import CloudKit
func saveCloudItem(Content: String, Date: Date) { //传入待同步到云端iCloud的参数数据
let context = persistentContainer.viewContext
let newItem = CD_Item(context: context)
newItem.Content = Content
newItem.Date = Date as NSDate
newItem.timestamp = Date()
do {
try context.save()
print("Item saved successfully.")
} catch {
let nsError = error as NSError
print("Failed to save item: \(nsError), \(nsError.userInfo)")
fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
}
}
// 在 AppDelegate 或其他适当的地方设置 persistentContainer
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "你的数据模型名")
// 设置 CloudKit 选项
if let description = container.persistentStoreDescriptions.first {
description.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
description.setOption(true as NSNumber, forKey: NSInferMappingModelAutomaticallyOption)
description.setOption(true as NSNumber, forKey: NSMigratePersistentStoresAutomaticallyOption)
let options = NSPersistentCloudKitContainerOptions(containerIdentifier: "你的容器名")
options.databaseScope = .private
description.cloudKitContainerOptions = options
}
container.loadPersistentStores { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
}
return container
}()
为什么newItem 只是一个临时变量,修改它,会影响context?实现同步icloud
在你的 saveCloudItem 函数中,newItem 是一个临时变量,但它实际上是一个 NSManagedObject 的实例,它被添加到了 Core Data 的上下文(context)中。当你创建一个新的 CD_Item 对象并将其与 context 关联时,这个对象就成为了持久化存储的一部分,并且对它的任何修改都会被记录在 context 中。
Core Data 上下文:
NSManagedObjectContext 是 Core Data 的核心对象之一,它管理一组 NSManagedObject 实例。
当你使用 let newItem = CD_Item(context: context) 创建一个新的 CD_Item 对象时,这个对象就被注册到了 context 中。
一旦 newItem 被注册到 context,对 newItem 的任何修改都会被 context 记录下来,等待保存操作来提交这些更改。
当你调用 context.save() 时,context 会将所有未提交的更改(包括新创建的对象、更新的对象和删除的对象)保存到持久化存储中。
如果启用了 CloudKit 集成,这些更改还会被同步到 iCloud。
———具体流程
1.创建新对象并注册到上下文:
let newItem = CD_Item(context: context)
设置属性:
newItem.Content = Content
newItem.Date = Date as NSDate
newItem.timestamp = Date()
2.保存上下文:
do {
try context.save()
print(“Item saved successfully.”)
} catch {
let nsError = error as NSError
print(“Failed to save item: (nsError), (nsError.userInfo)”)
fatalError(“Unresolved error (nsError), (nsError.userInfo)”)
}
在这个过程中,newItem 虽然是一个临时变量,但它实际上是 context 管理的一个 NSManagedObject。对 newItem 的任何修改都会被 context 记录,并在 context.save() 时提交到持久化存储。
Core Data 与 CloudKit 集成:
在 persistentContainer 中设置了 CloudKit 选项,Core Data 会自动处理本地数据和 iCloud 之间的同步。
任何对 context 的更改(如添加、更新或删除对象)都会被记录,并通过 CloudKit 同步到 iCloud。