首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CKModifyRecordsOperation --同时创建参考记录?

CKModifyRecordsOperation --同时创建参考记录?
EN

Stack Overflow用户
提问于 2020-09-07 12:02:12
回答 2查看 144关注 0票数 1

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

我有一门课程,有1+周,每个课程都有1+课程。以前,我会用CloudKit创建课程,然后创建周,然后再回过头来用创建后的课程引用来更新周。同时,获取并保存课程记录,其中包含对周的引用,每周创建一次。

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

代码语言:javascript
复制
    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

  • Update
  1. 保存课程
  2. Save
    1. 课程保存
    2. 带周参考

CKModifyRecordsOperation代码:

代码语言:javascript
复制
    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)
EN

回答 2

Stack Overflow用户

发布于 2020-09-07 17:27:34

我很肯定你能把所有这些记录放在一起。我怀疑一定有其他的错误,这就是为什么你要犯这个错误。

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

将所有这些记录组合到一个CKModifyRecordsOperation中是正确的,而且您不应该对CKRecord保存的顺序小心。我想另一个问题肯定隐藏在某个地方。

票数 1
EN

Stack Overflow用户

发布于 2020-09-07 18:35:25

我在apple论坛上找到了一个类似的问题,这个问题也有类似的问题,而且它帮助我找出了问题的根源--我在各种引用上创建的.deleteSelf操作实际上是创建了一个循环。

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

一旦我检查并调整了这些,错误就消失了,我就可以保存了。

发现这一点变得更加复杂,因为当我的保存按顺序而不是大容量的CKModifyRecordsOperation保存时,我没有像以前那样更改CKModifyRecordsOperation操作版本--而且运行良好。

因此,通过批量保存,CKModifyRecordsOperation的另一个额外好处是它添加了一层愚蠢性检查,以确保单独创建项目不会:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63777245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档