对于我将保存到CloudKit的每一条记录,我都会传入一个使用自己的UUID创建的CKRecord.ID,如下所示:
let recordId = CKRecord.ID(recordName: myOwnUUID, zoneID: .default)
let record = CKRecord(recordType: recordType, recordID: recordId)
record.setValue(title, forKey: "title")
...UUID是我的数据模型的一部分,不会对每个记录进行更改。
我能够成功地删除记录,再次传入相同的CKRecord.ID:
func delete(_ item: MyItem, completion: @escaping (Result<Int, Error>) -> ()) {
let myOwnUUID = item.id // this is the exact same UUID that I used to create/save the record the first time.
let recordId = CKRecord.ID(recordName: myOwnUUID, zoneID: .default)
ckDatabase.delete(withRecordID: recordId) { (recordId, error) in
DispatchQueue.main.async {
if let error = error {
completion(.failure(error))
return
}
guard recordId != nil else {
completion(.failure(CloudKitHelperError.castFailure))
return
}
completion(.success(0))
}
}
}所以,删除工作没有任何问题。
但是当我尝试修改记录时,我得到了错误:"Server Record Changed". "record to insert already exists"
}>
下面是我的修改代码:
func modify(_ item: MyItem, completion: @escaping (Result<Int, Error>) -> ()) {
let myOwnUUID = item.id // this is the exact same UUID that I used to create/save the record the first time.
let recordId = CKRecord.ID(recordName: myOwnUUID, zoneID: .default)
let record = CKRecord(recordType: recordType, recordID: recordId)
record.setObject(item.title as __CKRecordObjCValue, forKey: "title")
let configuration = CKOperation.Configuration()
configuration.timeoutIntervalForRequest = 10
configuration.timeoutIntervalForResource = 10
let operation = CKModifyRecordsOperation(recordsToSave: [record], recordIDsToDelete: nil)
operation.configuration = configuration
operation.modifyRecordsCompletionBlock = { (savedRecords, _, error) in
DispatchQueue.main.async {
if savedRecords != nil, error == nil {
completion(.success(0))
}
if let error = error {
completion(.failure(error))
}
}
}
ckDatabase.add(operation)
}顺便说一下,ckDatabase设置为:ckDatabase = CKContainer(identifier: "iCloud.com.xxx.yyy").privateCloudDatabase。
那么,为什么我不能使用我用来创建记录的CKRecord.ID来修改现有的记录呢?删除操作清楚地识别了它。
https://stackoverflow.com/questions/69357703
复制相似问题