如何用 zoneID 和 recordID 初始化 CKRecord?

How to initialize CKRecord with both zoneID and recordID?

我目前正在构建一个将 Core Data 记录同步到 CloudKit 的解决方案。

我需要帮助来确定我想用 CKRecord 做什么是可行的。

我已经查看了 Apple CloudKit 文档、进行了实验并在网上进行了搜索,但没有找到我想要的那种答案。

我想用 zoneID 和我将在 init 方法中提供的 recordID 来初始化 CKRecord。
初始化程序似乎迫使我在两者之间做出选择。我 想创建我自己的 ZoneID(不使用默认值),并设置 recordID 而不是自动生成。

可以吗?

您可以同时指定区域 ID 和记录 ID,但需要分三步完成:

首先,使用您的区域 ID 和用户创建一个 CKRecordZoneID

let ckRecordZoneID = CKRecordZoneID(zoneName: "myZone", ownerName: CKOwnerDefaultName)

然后您可以使用所需的记录 ID 并指定您的 CKRecordZoneID:

创建一个 CKRecordID
let ckRecordID = CKRecordID(recordName: recordIDString, zoneID: ckRecordZoneID)

最后,您可以使用该记录 ID 创建 CKRecord

let ckRecord = CKRecord(recordType: myRecordType, recordID: ckRecordID)

我对 CKRecord 进行了扩展,因此代码更改很少:

extension CKRecord {
    static func with(recordType: CKRecord.RecordType, zoneID: CKRecordZone.ID) -> CKRecord {
        let recordID = CKRecord.ID(recordName: UUID().uuidString, zoneID: zoneID)
        return CKRecord(recordType: recordType, recordID: recordID)
    }
}

所以而不是这个(旧的坏方法):

let myRecord = CKRecord(myType, zoneID: myZoneId)

变成:

let myRecord = CKRecord.with(myType, zoneID: myZoneId)

请注意,原始方法会为您生成一个记录名称,而我使用 UUID 完成了该操作,这可能是当今最标准的方法。如果我错了,请纠正我。

以前可以使用 recordID 和 zoneID 初始化 CKRecord。然而,这已被弃用:

 @available(swift, introduced: 4.2, deprecated: 4.2, message: "Use init(recordType:recordID:) + CKRecord.ID(zoneID:) instead")
public convenience init(recordType: CKRecord.RecordType, zoneID: CKRecordZone.ID)

然而,似乎可以使用未记录的方式以这种方式执行此操作,因此我假设初始化程序不可靠:

let recordID = CKRecord.ID(zoneID: myZoneID) //This initializer is not documented!!! 
let record = CKRecord(recordType: "aString", recordID: recordID)