gpt4 book ai didi

swift - 节省云套件记录到核心数据的最佳实践,获得偶发的运行时错误

转载 作者:行者123 更新时间:2023-11-30 10:08:40 25 4
gpt4 key购买 nike

我有下面的代码,在删除或不删除注释以及将无主 self 更改为弱 self 的情况下,十次中有八次我没有问题将记录 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 保存操作的婴儿中。本质上是在保存记录发生之前进行保存。到目前为止,一切都很好。假设 postRecord.recordID.recordName 的 CkRecord 名称将始终与返回的 CloudKit results.recordID.recordName 匹配,则此操作有效。这是一个正确的假设吗?

谢谢

最佳答案

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

try self!.moContext.save()

我为 NSOperationQueue 使用单例,并为操作使用观察者(如果应用程序进入后台,观察者会在后台给我更多的时间来完成操作)。查找上届 WWDC 有关操作的视频。

关于swift - 节省云套件记录到核心数据的最佳实践,获得偶发的运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34505496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com