Swift CKModifyRecordsOperation-是否同时创建引用的记录?

Swift CKModifyRecordsOperation-是否同时创建引用的记录?,swift,cloudkit,Swift,Cloudkit,我正在为CloudKit重构一个有点笨重的迭代保存循环,以使用CKModifyRecordsOperation和批量保存记录 我有一门课程,有1周以上的时间,每门课程有1节以上的课程。之前,我会在CloudKit中创建课程,然后创建周,然后创建课程,并在创建后使用课程参考更新周。创建周后,还可以获取并保存课程记录以及对周的引用 我已经进行了重构,在本地创建了所有(课程、周和课程)记录,并设置了相关的引用。例如,课程[“周”]包含我在本地创建的每周的记录参考,例如: course[“weeks”]

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

我有一门课程,有1周以上的时间,每门课程有1节以上的课程。之前,我会在CloudKit中创建课程,然后创建周,然后创建课程,并在创建后使用课程参考更新周。创建周后,还可以获取并保存课程记录以及对周的引用

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

course[“weeks”]=getweekrefsfsforcourse(for:allWeeks)
func getweekrefsfsforcourse(所有周:[CKRecord])->[CKRecord.Reference]{
var weekrefsray:[CKRecord.Reference]=[]
在所有的星期里,每个星期{
让weekRef=CKRecord.Reference(记录:每条,操作:.deleteSelf)
weekRefsArray.append(weekRef)
返回weekRefsArray
}
问题是,当我去保存时,返回的错误是:

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

这表明我有一个记录是关于它自己的,但是我一个记录一个记录地记录下来,我什么也看不到。这几周参考的是课程和课程,但不是他们自己,等等。所以我唯一的理论是,因为我试图保存引用其他尚未创建的项目的项目,所以我尝试做的是不可能的

这里的正确协议实际上是我最初的方法吗?还是我遗漏了什么?
原始方法:

  • 省道
  • 节省一周
  • 保存经验教训
  • 使用课程参考更新周
  • 用每周参考资料更新课程
  • CKModifyRecordsOperation代码:

    let bulkSaveQueryOp=CKModifyRecordsOperation()
    bulkSaveQueryOp.recordsToSave=[courseRecord]
    bulkSaveQueryOp.recordsToSave?.append(内容:周)
    bulkSaveQueryOp.recordsToSave?.append(内容:课程)
    //注:我已确认我有正确数量的记录
    bulkSaveQueryOp.modifyRecordsCompletionBlock={记录,记录ID,中的错误
    如果let error=error as?CKError{
    log.error(错误)
    }否则{//success}
    }
    CKContainer.default().publicCloudDatabase.add(bulkSaveQueryOp)
    
    我很确定您可以一起创建所有这些记录。我怀疑一定是出了什么问题,这就是为什么您会出现这个错误

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


    将所有这些记录合并成一个
    CKModifyRecordsOperation
    是正确的做法,您不必担心
    CKRecord
    保存的顺序。我想肯定还有另一个问题潜伏在某处。

    我在苹果开发论坛上为有类似问题的人找到了一个类似的问题这有助于确定问题的根源——我已经用我在各种引用上创建的.deleteSelf操作有效地创建了一个循环

    因此,虽然引用很好,但操作是导致错误的原因

    一旦我仔细检查并调整了它们,错误就消失了,我可以保存了

    发现这一点变得更加复杂,因为我没有改变.deleteSelf-actions版本,这与我以前在顺序保存而不是批量CKModifyRecordsOperation保存时所做的一样,而且工作正常


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

    谢谢@Clifton-没错,您可以创建相互引用的对象,同时保存。问题在于使用.deleteSelf操作,其中应该是的,没有!