将云计算工具包记录到核心数据的最佳实践,获得零星的运行时错误

时间:2015-12-29 06:15:48

标签: swift core-data runtime-error cloudkit

我有下面的代码,在这两种情况下,有或没有删除注释,并且将无主自我更改为弱自我8次中有10次我没有问题将记录ID发布到核心数据,但是,在其他情况下,我得到一个运行时错误,它似乎在try.self.moContext.save()行。错误发生在不同的线程上,并且在调试中显示abortretainunowned ...

            CKContainer.defaultContainer().publicCloudDatabase.saveRecord(postRecord, completionHandler: { [unowned self] (record, error) -> Void in
               // dispatch_async(dispatch_get_main_queue()) {
                    if error != nil {
                        print("Error Saving to Cloud \(error)")
                    } else {
                    photoData.cloudKitID = record!.recordID.recordName as String
                        //Save to CoreData
                        do {
                            try self.moContext.save()
                            print("Saved Posted ReocrdID Name to CoreData \(record!.recordID.recordName)")
                            self.moContext.refreshAllObjects()
                        } catch let error {
                            //Check for Error
                            print("Error is \(error)")
                        }
                    }
               // }
            })

更新

我认为我找到了一个解决方案,如果有人能够验证这是否是最佳实践,那将是值得赞赏的。

由于我必须通过初始化为CKRecord来创建postRecord,postRecord实际上已经发布了云套件记录名称postRecord.recordID.recordName。所以我将我的核心数据保存为CloudKit保存操作。在saverecord发生之前基本上保存。到现在为止还挺好。这可以假设postRecord.recordID.recordName的CkRecord名称将始终与返回的CloudKit results.recordID.recordName匹配。这是正确的假设吗?

由于

1 个答案:

答案 0 :(得分:1)

请记住,CloudKit操作是异步的,并且有许多原因它们可能会失败,因此在您知道结果之前保存任何缓存或数据并不是一个好主意(除非您将缓存标记为“未保存”或类似的内容,因为重试目的)。 你需要做的是在你的块/闭包中使用[弱自我],然后检查self是否为零继续。 此外,你所有的自我需求和“?”要么 ”!”

try self!.moContext.save()

我为我的NSOperationQueue使用单例和操作的观察者(如果app进入后台,观察者会在后台给我更多秒来完成操作)。寻找关于操作的最后一个WWDC的视频。