Ios CKModifyRecords操作对整批记录无效
据我所知,Ios CKModifyRecords操作对整批记录无效,ios,swift,cloudkit,Ios,Swift,Cloudkit,据我所知,CKModifyRecordsOperation(recordsToSave:,recordsToDelete:)方法应该可以同时修改多条记录和删除多条记录 在我的代码中,recordsToSave是一个包含2个CKRecords的数组。我没有要删除的记录,因此我将recordsToDelete设置为nil。令人费解的是,recordsToSave[0]似乎正确地保存到了云中,而recordsToSave[1]却没有 要在粘贴代码之前提供更多上下文,请执行以下操作: 在我的应用程序中,
CKModifyRecordsOperation(recordsToSave:,recordsToDelete:)
方法应该可以同时修改多条记录和删除多条记录
在我的代码中,recordsToSave
是一个包含2个CKRecords
的数组。我没有要删除的记录,因此我将recordsToDelete
设置为nil
。令人费解的是,recordsToSave[0]
似乎正确地保存到了云中,而recordsToSave[1]
却没有
要在粘贴代码之前提供更多上下文,请执行以下操作:
在我的应用程序中,有一个“加入”按钮与提要上的每个帖子关联。当用户点击“加入”按钮时,会发生两个云事务:1)帖子的引用被添加到[CKReference]
类型的joinedList
,2)帖子的记录应该增加其NUM_PEOPLE
属性。根据CloudKit仪表板,云事务#1正在发生,而不是#2
这是我的代码,省略了不相关的部分:
@IBAction func joinOrLeaveIsClicked(_ sender: Any) {
self.container.fetchUserRecordID() { userRecordID, outerError in
if outerError == nil {
self.db.fetch(withRecordID: userRecordID!) { userRecord, innerError in
if innerError == nil {
var joinedList: [CKReference]
if userRecord!.object(forKey: JOINED_LIST) == nil {
joinedList = [CKReference]() // init an empty list
}
else {
joinedList = userRecord!.object(forKey: JOINED_LIST) as! [CKReference]
}
let ref = CKReference(recordID: self.post.recordID, action: .none)
// ... omitted some of the if-else if-else ladder
// add to list if you haven't joined already
else if !joinedList.contains(ref) {
// modifying user record
joinedList.append(ref) // add to list
userRecord?[JOINED_LIST] = joinedList as CKRecordValue // associate list with user record
// modifying post
let oldCount = self.post.object(forKey: NUM_PEOPLE) as! Int
self.post[NUM_PEOPLE] = (oldCount + 1) as CKRecordValue
let operation = CKModifyRecordsOperation(recordsToSave: [userRecord!, self.post], recordIDsToDelete: nil)
self.db.add(operation)
}
// omitted more of the if-else if-else ladder
else {
if let error = innerError as? CKError {
print(error)
}
}
}
}
else {
if let error = outerError as? CKError {
print(error)
}
}
}
}
编辑
下面是我根据第一个评论者的请求添加的代码
operation.modifyRecordsCompletionBlock = { savedRecords, deletedRecordsIDs, error in
if error == nil {
DispatchQueue.main.async(execute: {
self.num.text = String(oldCount + 1) // UI update
})
}
else {
print(error!)
}
}
另一次编辑
let operation = CKModifyRecordsOperation(recordsToSave: [userRecord!, self.post], recordIDsToDelete: nil)
operation.perRecordCompletionBlock = { record, error in
if error != nil {
let castedError = error as! NSError
print(castedError)
}
}
operation.modifyRecordsCompletionBlock = { savedRecords, deletedRecordsIDs, error in
if error == nil {
DispatchQueue.main.async(execute: {
self.num.text = String(oldCount + 1) // UI update
})
}
else {
print(error!)
}
}
self.db.add(operation)
您是否实施了
perRecordCompletionBlock
和/或modifyRecordsCompletionBlock
以检查错误?感谢您指出这一点!我添加了一些代码,我将这些代码添加到了上面底部的帖子中。UI更新未发生,因此一定有错误。但是,我的打印(错误!)
不起作用。我在网上很难找到如何正确打印错误。我需要投吗?在我添加感叹号之前,我收到一条警告,它的类型是Any
,我不希望出现在这里。因为您只得到一个部分错误,error
是一个值为partialError
的枚举。您应该记录传递到perRecordCompletionBlock
的错误,以获取每个记录的特定错误;我没有意识到我需要这两个功能。我仍然有打印错误的问题,虽然。我在上面编辑了我的帖子,加入了我的perRecordCompletionBlock
code。我试图将错误转换为NSError
,希望这样可以打印出来……但仍然没有结果……哦,我要尝试。本地化描述