gpt4 book ai didi

ios - CKShare "Server record changed"错误

转载 作者:行者123 更新时间:2023-11-28 10:46:20 24 4
gpt4 key购买 nike

我在保存 CKShare 时遇到了问题。执行共享时,一切正常,但如果取消共享并尝试再次共享,我会收到错误消息:

"Server Record Changed" (14/2004); server message = "client oplock error updating record"

以下是我的分享代码:

func share(_ deck: Deck) {

let zoneID = CKManager.defaultManager.sharedZone?.zoneID


if let deckName = deck.name {
selectedDeckForPrivateShare = deckName
}

var records = [CKRecord]()


let deckRecord = deck.deckToCKRecord(zoneID)

records.append(deckRecord)


let reference = CKReference(record: deckRecord, action: .none)

for index in deck.cards {
let cardRecord = index.cardToCKRecord(zoneID)
cardRecord["deck"] = reference
cardRecord.parent = reference

records.append(cardRecord)

}


let share = CKShare(rootRecord: deckRecord)
share[CKShareTitleKey] = "\(String(describing: deck.name)))" as CKRecordValue?
records.append(share)
let sharingController = UICloudSharingController { (controller, preparationCompletion) in


let modifyOP = CKModifyRecordsOperation(recordsToSave: records, recordIDsToDelete: nil)

modifyOP.qualityOfService = .userInteractive
modifyOP.modifyRecordsCompletionBlock = { (savedRecords,deletedRecordIDs,error) in
preparationCompletion(share, CKContainer.default(), error)

controller.delegate = self

if let error = error {
print(error)

}
}


self.privateDatabase.add(modifyOP)

}


sharingController.delegate = self

self.present(sharingController, animated: true, completion: {

})
}

deckToCKRecord()cardToCKRecord() 这两个方法是我用来将 Core Data 转换为 CKRecord 以便共享它们的方法。谢谢。

最佳答案

有可能即使共享操作被取消(因为您没有明确说明取消的意思),您设置的 CKShare 记录实际上已创建并保存在您的私有(private)数据库中。您只是取消了更改其他用户的参与状态(例如受邀)。因此,当您重复此过程时,您正在尝试重新保存相同的 CKShare,尽管重新设置可能会修改更改标签。 CloudKit 看到这一点并返回“服务器记录已更改”错误。

如果我是对的,你可以用两种方法之一来处理这个问题。首先,设置 CKModifyRecordsOperation 的值变量 savePolicy.allKeys ,例如,就在您设置 qualityOfService 的位置变种。这将要求即使 CloudKit 在您的服务器上找到记录,它也会自动覆盖它。如果您确定上传的版本应该总是获胜,这是一个很好的方法(并且只会产生一个网络调用)。

大多数人使用的第二种更通用的方法是首先制作一个 CKFetchRecordsOperation与根记录的 share变种记录ID。全部CKRecord对象有一个 share var 这是一个 CKReference ,但如果对象尚未共享,则这将为 nil。如果我是对的,在取消后的第二次尝试中,您会发现根记录的共享引用包含您在第一次尝试时设置的 CKShare。因此,捕获那份份额,然后像以前一样启动您 parent 的其余部分和其他引用资料!

关于ios - CKShare "Server record changed"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48391834/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com