CKModifyRecordsOperation-同时创建引用的记录吗?

问题描述

我正在为CloudKit重构一个笨重的迭代保存循环,以使用CKModifyRecordsOperation和批量保存记录。

我有一门课程,有1个以上的星期,每个星期有1个以上的课程。之前,我先在CloudKit中创建课程,然后创建Weeks,然后创建Lessons,然后回圈以使用创建的Lessons引用来更新Weeks。创建周后,还可以获取并保存与周相关的课程记录。

我已经重构为在本地创建所有(课程,周和课程)记录,并设置了相关的参考。例如,course [“ weeks”]包含我在本地创建的每周的记录引用,例如:

p4 integrate -c 625466 //SrcPath/...@622912,@622912 //DestPath/...

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

无效的记录列表:在记录图中检测到周期

这表明我有一个关于自身的记录,但是我逐条记录,我什么也看不到。 Weeks引用课程和课程,但不引用自身,等等。所以我唯一的理论是,因为我要保存引用尚未创建的其他项目的项目,所以我要做的是不可能。

这里正确的协议实际上是我的原始方法吗?还是我想念的东西?
原始方法

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

CKModifyRecordsOperation代码

    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
    }

解决方法

我相当确定您可以一起创建所有这些记录。我怀疑肯定还有其他问题,这就是为什么您会收到该错误。

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

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

,

我能够在Apple开发人员论坛中为遇到类似问题的人找到类似问题,并且它有助于找出问题的根源-我已经使用自己创建的.deleteSelf动作有效地创建了一个循环在各种参考文献上。

因此,尽管引用很好,但操作是导致错误的原因。

我再次检查并调整了这些错误,错误消失了,我得以保存。

由于我没有按以前的方式更改.deleteSelf操作版本,因此发现这一点变得更加复杂,因为我按顺序执行保存时可以正常工作,而不是按批量CKModifyRecordsOperation保存。

>

因此可以看出,CKModifyRecordsOperation的另一个附加好处是可以批量保存,它增加了一层愚蠢的检查功能,以防止单独创建项目:)