我目前正在构建一个将Core Data
记录同步到CloudKit
的解决方案。
我需要帮助才能找到我想用CKRecord
做的事情是可行的。
我已经检查过Apple CloudKit文档,在网上进行实验和搜索,但是我找不到我想要的那种答案。
我想初始化CKRecord,我将在init方法中提供zoneID
和recordID
。
初始化器似乎迫使我在两者之间做出选择。一世
想要创建我自己的ZoneID(不使用默认值),还要设置recordID
而不是自动生成它。
这可能吗?
答案 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)