【发布时间】:2020-09-07 12:02:12
【问题描述】:
我正在努力为 CloudKit 重构一个有点笨重的迭代保存循环,以使用 CKModifyRecordsOperation 和批量保存记录。
我有一门课程,有 1+ 周,每周有 1+ 课。以前我会在 CloudKit 中创建课程,然后创建周,然后是课程,然后返回以使用创建后的课程参考来更新周。一旦创建了周,还可以获取并保存包含对周的引用的课程记录。
我已重构以在本地创建所有(课程、周和课程)记录,并设置了相关参考。例如, course["weeks"] 包含我在本地创建的每周的记录引用,例如:
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
}
问题是当我去保存时,我得到的错误是:
记录列表无效:记录图中检测到循环
这表明我有一条记录指向它自己,但我已经逐条记录了,我什么也看不到。周引用课程和课程,但不引用它们本身等。所以我唯一的理论是,因为我试图保存引用尚未创建的其他项目的项目,所以我想做的是'不可能。
这里的正确协议实际上是我原来的方法吗?还是我缺少什么?
原来的做法:
- 保存课程
- 保存一周
- 保存课程
- 使用课程参考更新周数
- 使用周参考更新课程
CKModifyRecords操作码:
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)
【问题讨论】: