将云套件记录保存到核心数据的最佳实践,得到零星的运行时错误
Best practice for savings cloud kit record to core data, getting sporadic runtime error
我有以下代码,在删除评论或不删除评论以及将无主自我更改为弱自我的情况下,10 次中有 8 次我没有问题将记录 ID 设为 post对于核心数据,然而,在其他情况下,我得到一个 运行 时间错误,它似乎在 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 在 posted 之前实际上已经有了云工具包记录名称 postRecord.recordID.recordName .所以我将我的核心数据保存移动到 CloudKit 保存操作的婴儿。本质上是在保存记录发生之前进行保存。到目前为止,一切都很好。这工作假设 postRecord.recordID.recordName 的 CkRecord 名称将始终匹配返回的 CloudKit results.recordID.recordName。这是一个正确的假设吗?
谢谢
请记住,CloudKit 操作是异步的,它们可能失败的原因有很多,因此在知道结果之前保存任何缓存或数据并不是一个好主意(除非您将缓存标记为 "unsaved" 或类似的东西,用于重试目的)。
您需要做的是在 block/closure 中使用 [weak self] 然后检查 self 是否不为 nil 以继续。
此外,您对自我的所有呼唤都需要和“?”要么 ”!”
try self!.moContext.save()
我为我的 NSOperationQueue 使用单例,并为操作使用观察者(如果应用程序进入后台,观察者会在后台给我更多的时间来完成操作)。找上一届 WWDC 关于运营的视频。
我有以下代码,在删除评论或不删除评论以及将无主自我更改为弱自我的情况下,10 次中有 8 次我没有问题将记录 ID 设为 post对于核心数据,然而,在其他情况下,我得到一个 运行 时间错误,它似乎在 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 在 posted 之前实际上已经有了云工具包记录名称 postRecord.recordID.recordName .所以我将我的核心数据保存移动到 CloudKit 保存操作的婴儿。本质上是在保存记录发生之前进行保存。到目前为止,一切都很好。这工作假设 postRecord.recordID.recordName 的 CkRecord 名称将始终匹配返回的 CloudKit results.recordID.recordName。这是一个正确的假设吗?
谢谢
请记住,CloudKit 操作是异步的,它们可能失败的原因有很多,因此在知道结果之前保存任何缓存或数据并不是一个好主意(除非您将缓存标记为 "unsaved" 或类似的东西,用于重试目的)。 您需要做的是在 block/closure 中使用 [weak self] 然后检查 self 是否不为 nil 以继续。 此外,您对自我的所有呼唤都需要和“?”要么 ”!”
try self!.moContext.save()
我为我的 NSOperationQueue 使用单例,并为操作使用观察者(如果应用程序进入后台,观察者会在后台给我更多的时间来完成操作)。找上一届 WWDC 关于运营的视频。