我有下面的代码,在这两种情况下,有或没有删除注释,并且将无主自我更改为弱自我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匹配。这是正确的假设吗?
由于
答案 0 :(得分:1)
请记住,CloudKit操作是异步的,并且有许多原因它们可能会失败,因此在您知道结果之前保存任何缓存或数据并不是一个好主意(除非您将缓存标记为“未保存”或类似的内容,因为重试目的)。 你需要做的是在你的块/闭包中使用[弱自我],然后检查self是否为零继续。 此外,你所有的自我需求和“?”要么 ”!”
try self!.moContext.save()
我为我的NSOperationQueue使用单例和操作的观察者(如果app进入后台,观察者会在后台给我更多秒来完成操作)。寻找关于操作的最后一个WWDC的视频。