在我的用例中,我有两个实体
List
和 Item
,它们具有可选的一对多关系。我想在 List
上有两个非瞬态派生属性:items.@count
和 items.@sum
。这个有用吗?
为了实现这一点,我认为只要设备从 Cloudkit 接收到列表记录或相关项目记录,核心数据就必须重新计算这些属性。 CoreKit 能做到这一点吗?
如果这没有自动发生,我可以让它工作吗?也许我可以使用 NSPersistentHistoryTrackingKey 检查每个传入的
List
和 Item
并计算真实计数和总和,将它们与最新 List
实体中的内容进行比较,如果错误则更新 List
实体。但这似乎可能会导致大量的乒乓更新和冲突。
谢谢你
我理解你的问题。以下代码演示了如何使用 Core Data 和 CloudKit 实现派生属性:
import CoreData
import CloudKit
// Assuming you have List and Item entities with a one-to-many relationship
// List entity
class List: NSManagedObject {
@NSManaged var items: Set<Item>
@NSManaged var itemCount: Int16
@NSManaged var itemSum: Double
}
// Item entity
class Item: NSManagedObject {
@NSManaged var value: Double
}
// In your CoreData stack setup, enable history tracking
let description = NSPersistentStoreDescription()
description.cloudKitContainerOptions = NSPersistentCloudKitContainerOptions(containerIdentifier: "your.container.id")
description.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
// Whenever you update related Item records in Core Data, recalculate derived attributes
func updateDerivedAttributes(for list: List) {
let itemCount = list.items.count
let itemSum = list.items.reduce(0.0, { $0 + $1.value })
list.itemCount = Int16(itemCount)
list.itemSum = itemSum
// Save your managedObjectContext to persist changes
}
// CloudKit subscription to monitor changes and trigger updates
let subscription = CKQuerySubscription(recordType: "List", predicate: NSPredicate(value: true), options: .firesOnRecordCreation)
let notificationInfo = CKSubscription.NotificationInfo()
notificationInfo.shouldSendContentAvailable = true
subscription.notificationInfo = notificationInfo
// Add the subscription to your CloudKit database
let container = CKContainer(identifier: "your.container.id")
let database = container.privateCloudDatabase
database.save(subscription) { subscription, error in
// Handle subscription save completion
}
请记住,在 CloudKit 中使用派生属性可能会带来复杂性,特别是在同步和冲突方面。您可能需要仔细管理更新以避免过多的冲突。使用
NSPersistentHistoryTrackingKey
的方法可以工作,但如果更新频繁,确实可能会导致冲突。如果需要,请考虑使用冲突解决策略。