【问题标题】:CKModifyRecordsOperation - create referenced records simultaneously?CKModifyRecordsOperation - 同时创建引用记录?
【发布时间】: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
    }

问题是当我去保存时,我得到的错误是:

记录列表无效:记录图中检测到循环

这表明我有一条记录指向它自己,但我已经逐条记录了,我什么也看不到。周引用课程和课程,但不引用它们本身等。所以我唯一的理论是,因为我试图保存引用尚未创建的其他项目的项目,所以我想做的是'不可能。

这里的正确协议实际上是我原来的方法吗?还是我缺少什么?
原来的做法:

  1. 保存课程
  2. 保存一周
  3. 保存课程
  4. 使用课程参考更新周数
  5. 使用周参考更新课程

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)

【问题讨论】:

    标签: swift cloudkit


    【解决方案1】:

    我相当肯定您可以一起创建所有这些记录。我怀疑肯定有其他问题,这就是您收到该错误的原因。

    您可以为一个对象甚至不存在创建CKReference,CloudKit 仍会创建它。 CKReference 只不过是指向容器中另一个对象的 recordName 的指针。

    将所有这些记录合并到CKModifyRecordsOperation 是正确的做法,您不必注意CKRecord 保存的顺序。我认为另一个问题一定潜伏在某个地方。

    【讨论】:

    • 感谢@Clifton - 你是对的,你可以创建相互引用的对象并同时保存。原来问题出在使用 .deleteSelf 操作的地方应该是 .none!
    【解决方案2】:

    我能够在苹果开发者论坛中为遇到类似问题的人找到一个类似的问题,并且它有助于确定问题的根源 - 我已经使用我正在创建的 .deleteSelf 操作有效地创建了一个循环各种参考资料。

    因此,虽然引用没有问题,但操作是导致错误的原因。

    一旦我仔细检查并调整了这些,错误就消失了,我能够保存。

    当我按顺序保存而不是批量 CKModifyRecordsOperation 保存时,我并没有像以前所做的那样更改 .deleteSelf 操作版本,而且工作正常,因此发现这一点变得更加复杂。

    因此,CKModifyRecordsOperation 与批量保存的另一个额外好处是它增加了一层愚蠢检查,即单独创建项目不会:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多