如何用zoneID和recordID初始化CKRecord?

时间:2017-08-01 04:46:10

标签: ios cloudkit

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

我需要帮助才能找到我想用CKRecord做的事情是可行的。

我已经检查过Apple CloudKit文档,在网上进行实验和搜索,但是我找不到我想要的那种答案。

我想初始化CKRecord,我将在init方法中提供zoneIDrecordID
初始化器似乎迫使我在两者之间做出选择。一世 想要创建我自己的ZoneID(不使用默认值),还要设置recordID而不是自动生成它。

这可能吗?

3 个答案:

答案 0 :(得分:10)

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

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

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

然后,您可以使用所需的记录ID创建CKRecordID并指定CKRecordZoneID

let ckRecordID = CKRecordID(recordName: recordIDString, zoneID: ckRecordZoneID)

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

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

答案 1 :(得分:1)

我在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进行了记录,这可能是当今最标准的方法。如果我错了,请纠正我。

答案 2 :(得分:0)

以前,可以使用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)