Core Data 派生属性是否可以与 Cloudkit 一起正常工作?

问题描述 投票:0回答:1

在我的用例中,我有两个实体

List
Item
,它们具有可选的一对多关系。我想在
List
上有两个非瞬态派生属性:
items.@count
items.@sum
。这个有用吗?

为了实现这一点,我认为只要设备从 Cloudkit 接收到列表记录或相关项目记录,核心数据就必须重新计算这些属性。 CoreKit 能做到这一点吗?

如果这没有自动发生,我可以让它工作吗?也许我可以使用 NSPersistentHistoryTrackingKey 检查每个传入的

List
Item
并计算真实计数和总和,将它们与最新
List
实体中的内容进行比较,如果错误则更新
List
实体。但这似乎可能会导致大量的乒乓更新和冲突。

谢谢你

core-data
1个回答
0
投票

我理解你的问题。以下代码演示了如何使用 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
的方法可以工作,但如果更新频繁,确实可能会导致冲突。如果需要,请考虑使用冲突解决策略。

© www.soinside.com 2019 - 2024. All rights reserved.