【发布时间】:2019-02-09 18:58:24
【问题描述】:
我们正在通过 Citrix Secure Hub 运行应用程序,似乎有时会出现回滚并丢失 CoreData 中的一些数据。
据我了解,CoreData 拥有所有对象的工作副本,有时它会尝试将其保留在文件系统上。
尝试模拟该行为但没有任何成功,我们在测试环境中找不到任何数据丢失或回滚数据。
那么有没有办法强制 iOS 在磁盘上写入当前的“工作副本”,以防止在使用过多内存时丢失任何数据(并且可能会崩溃)?我们在
之后调用我们的保存函数正如我们已经发现的那样:
我们没有使用:
func applicationWillResignActive(_ application: UIApplication) {
print("applicationWillResignActive")
}
要保存上下文,这可能是个问题吗(我们已经在每个创建对象后保存上下文)?
目前,当无法保存上下文时,我们并没有真正处理问题,是否有任何建议如何在生产环境中处理?应用程序崩溃以防止用户因数据丢失而苦苦挣扎,这是一件好事吗?
编辑:这是使用的核心数据处理程序:
import Foundation
import CoreData
let context = CoreDataManager.shared.managedObjectContext
func saveContext(_ completion: (() -> Void)? = nil) {
CoreDataManager.shared.save(completion)
}
func saveContextSync() {
CoreDataManager.shared.saveSync()
}
class CoreDataManager: NSObject {
static let shared = CoreDataManager()
lazy var managedObjectContext: NSManagedObjectContext = {
var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator
return managedObjectContext
}()
还有我们的保存功能:
@objc func save(_ completion: (() -> Void)?) {
saveAsync(completion)
}
func saveAsync(_ completion: (() -> Void)?) {
func save() {
context.perform {
do { try context.save() }
catch {
// HERE WE NEED TO HANDLE IT FOR A PRODUCTIVE ENVIRONMENT
}
completion?()
}
}
if Thread.isMainThread {
save()
} else {
DispatchQueue.main.async {
save()
}
}
}
func saveSync() {
func save() {
context.performAndWait {
do { try context.save() }
catch { print(error)
// TRY TO REPRODUCE MEMORY LOSS APP TO SEE WHAT HAPPENS
abort()
}
}
}
if Thread.isMainThread {
save()
} else {
DispatchQueue.main.sync {
save()
}
}
}
编辑 2:Objective C 中的这个问题应该非常相似:
Core Data reverts to previous state without apparent reason
编辑 3:似乎没有崩溃,一些用户告诉我他们正在添加数据,然后只需按主页按钮,几个小时后,上一个“任务”的数据就会丢失。
【问题讨论】:
-
可能我不明白你的问题,但不是
do { try managedContext.save() } catch let error as NSError { // Handle error }你在找什么? -
不,我不这么认为 - 如果您说:尝试 managedContext.save() 您只是要求保存上下文,但您无法控制它是否真的保存到磁盘。我们遇到同样的问题,例如:stackoverflow.com/questions/33600914/data-loss-core-data
-
感谢您指出这一点 - 我是核心数据的新手,不知道这个问题!
-
核心数据确实立即保存到磁盘——除非您使用嵌套上下文。你是?如果是这样,请参阅例如stackoverflow.com/questions/10428351/…
-
感谢 matt 的回答,但我看到我们没有使用嵌套上下文。有没有机会证明这一点?