我正在重构一个有点笨重的迭代保存循环,以便CloudKit使用CKModifyRecordsOperation和批量保存记录。
我有一门课程,有1+周,每个课程都有1+课程。以前,我会用CloudKit创建课程,然后创建周,然后再回过头来用创建后的课程引用来更新周。同时,获取并保存课程记录,其中包含对周的引用,每周创建一次。
我已经重构为在本地创建所有(课程、周和课)记录,并设置了相关的参考资料。例如,课程“周”包含我在本地创建的每周的记录引用,例如:
course["weeks"] = getWeekRefsForCourse(for: allWeeks)
func getWeekRefsForCourse(for allWeeks: [CKRecord]) -> [CKRecord.Reference] {
var weekRefsArray: [CKRecord.Reference] = []
for each in allWeeks {
let weekRef = CKRecord.Reference(record: each, action: .deleteSelf)
weekRefsArray.append(weekRef)
return weekRefsArray
}问题是当我去保存时,我得到的错误是:
无效记录列表:在记录图中检测到周期
这表明我已经有了一张关于自己的记录,但是我已经记录了一张又一张,我什么也看不见。周指的是课程和课程,但不是课程本身等等。所以我唯一的理论是,因为我试图保存那些提到其他尚未创建的项目的项目,所以我试图做的事情是不可能的。
这里的正确协议实际上是我最初的方法吗?还是我错过了什么?
最初的方法:
Lessons
CKModifyRecordsOperation代码:
let bulkSaveQueryOp = CKModifyRecordsOperation()
bulkSaveQueryOp.recordsToSave = [courseRecord]
bulkSaveQueryOp.recordsToSave?.append(contentsOf: weeks)
bulkSaveQueryOp.recordsToSave?.append(contentsOf: lessons)
//note I've confirmed I have the correct number of records
bulkSaveQueryOp.modifyRecordsCompletionBlock = { records, recordIDs, error in
if let error = error as? CKError {
log.error(error)
} else { // success }
}
CKContainer.default().publicCloudDatabase.add(bulkSaveQueryOp)发布于 2020-09-07 17:27:34
我很肯定你能把所有这些记录放在一起。我怀疑一定有其他的错误,这就是为什么你要犯这个错误。
您可以为一个甚至不存在的对象( CKReference )创建一个,而CloudKit仍然会创建它。CKReference只不过是一个指向容器中另一个对象的recordName的指针。
将所有这些记录组合到一个CKModifyRecordsOperation中是正确的,而且您不应该对CKRecord保存的顺序小心。我想另一个问题肯定隐藏在某个地方。
发布于 2020-09-07 18:35:25
我在apple论坛上找到了一个类似的问题,这个问题也有类似的问题,而且它帮助我找出了问题的根源--我在各种引用上创建的.deleteSelf操作实际上是创建了一个循环。
因此,虽然引用很好,但是操作是导致错误的原因。
一旦我检查并调整了这些,错误就消失了,我就可以保存了。
发现这一点变得更加复杂,因为当我的保存按顺序而不是大容量的CKModifyRecordsOperation保存时,我没有像以前那样更改CKModifyRecordsOperation操作版本--而且运行良好。
因此,通过批量保存,CKModifyRecordsOperation的另一个额外好处是它添加了一层愚蠢性检查,以确保单独创建项目不会:)
https://stackoverflow.com/questions/63777245
复制相似问题