可以使用 CKDatabase 的便捷方法将记录保存到 iCloudsaveRecord:
或通过 CKModifyRecordsOperation。如果是单条记录,则可以使用saveRecord:
但需要获取您想要修改的记录fetchRecordWithID:
在将其保存回 iCloud 之前。否则,它只会让您使用新的 RecordID 保存记录。更多这里。 https://stackoverflow.com/questions/24509782/saving-modified-data-in-cloudkit/24520514#24520514
database.fetchRecordWithID(recordId, completionHandler: { record, error in
if let fetchError = error {
println("An error occurred in \(fetchError)")
} else {
// Modify the record
record.setObject(newName, forKey: "name")
}
}
database.saveRecord(aRecord, completionHandler: { record, error in
if let saveError = error {
println("An error occurred in \(saveError)")
} else {
// Saved record
}
}
上面的代码只是方向正确,但不会按原样工作,因为当 fetchRecordWithID 的completionHandler 返回时,saveRecord 已经被触发。一个简单的解决方案是将 saveRecord 嵌套在 fetchRecordWithID 的completionHandler 中。一个可能更好的解决方案是将每个调用包装在NSBlockOperation
并将它们添加到 NSOperationQueue 中,saveOperation 依赖于 fetchOperation。
这部分代码将用于CKModifyRecordsOperation
如果您只更新一条记录,则不需要:
var ops:CKModifyRecordsOperation = CKModifyRecordsOperation()
ops.savePolicy = CKRecordSavePolicy.IfServerRecordUnchanged
database.addOperation(ops)
如果您确实使用CKModifyRecordsOperation
相反,您还需要设置至少一个完成块,并在检测到与现有记录存在冲突时处理错误:
let saveRecordsOperation = CKModifyRecordsOperation()
var ckRecordsArray = [CKRecord]()
// set values to ckRecordsArray
saveRecordsOperation.recordsToSave = ckRecordsArray
saveRecordsOperation.savePolicy = .IfServerRecordUnchanged
saveRecordsOperation.perRecordCompletionBlock { record, error in
// deal with conflicts
// set completionHandler of wrapper operation if it's the case
}
saveRecordsOperation.modifyRecordsCompletionBlock { savedRecords, deletedRecordIDs, error in
// deal with conflicts
// set completionHandler of wrapper operation if it's the case
}
database.addOperation(saveRecordsOperation)
除了使用 Objective-C 语言编写的 CloudKitAtlas 演示应用程序之外,还没有太多示例代码。希望这可以帮助。