- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在保存 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/
我已成功将 CKShare URL 保存到 CloudKit,并且我可以在 CloudKit 仪表板中看到该用户已INVITED。我的 Mac 应用程序通过电子邮件将 URL 发送给该人,但当他们单击
场景 UserA 与 UserB 共享 5 条记录 UserC 与 UserB 共享 3 条记录 UserD 与 UserB 共享 10 条记录 UserB 已接受所有这些共享。 目标 我想为 Use
我需要了解: 当记录不再与我共享时 当权限从readwrite 更改为仅read 有可能吗? 最佳答案 哦,答案很简单: let shareSubscription = CKQuerySubscrip
我正在尝试在我的应用程序中实现云套件共享,但是,每当我尝试使用 UICloudSharingController 共享项目时,我都会收到一致的错误: 我会看到用于添加人员的初始共享弹出窗口,然后当我选
对于现在和单个共享,我是这样做的: //here I have access to record fetched from cloud database let controller = UIClou
我试图允许我的应用程序的用户能够检索他们已经共享的记录的 iCloud 共享链接。我可以在创建共享时通过使用 let share = CKShare(rootRecord: CKRecord) 和 A
我在保存 CKShare 时遇到了问题。执行共享时,一切正常,但如果取消共享并尝试再次共享,我会收到错误消息: "Server Record Changed" (14/2004); server me
我正在研究 Apple 今年发布的新 CKShare,我对它有一些疑问。我试图关注 WWDC 的“CloudKit 的新功能”视频,但部分代码在 Xcode 中不再有效。 我想做的是:用户将输入他的姓
我正在尝试保存一个 CKRecord(已经创建并保存到数据库)和一个新的 CKShare 到它,但我一直收到这个错误:Optional("Failed to modify some records")
我是一名优秀的程序员,十分优秀!