我正在使用以下教程将Core Data集成到我的Swift IOS应用程序中。如视频所示,我的持久性管理器是通过单例模式创建的。以下是描述它的代码:
import Foundation
import CoreData
class DataLogger {
private init() {}
static let shared = DataLogger()
lazy var context = persistentContainer.viewContext
private var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "mycoolcontainer")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
print("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
func save () {
if self.context.hasChanges {
self.context.perform {
do {
try self.context.save()
} catch {
print("Failure to save context: \(error)")
}
}
}
}
}
现在,如果我使用以下代码创建一个包含大约1000个MyEntity实体对象( MyEntity是Core Data实体对象 )的循环,应用程序会崩溃。
class MySampleClass {
static func doSomething {
for i in 0 ..< 1000 {
let entry = MyEntity(context: DataLogger.shared.context);
// do random things
}
DataLogger.shared.save()
}
}
在我的代码中,出现了崩溃情况:MyEntity(context: DataLogger.shared.context),我尝试查看日志以便排查错误,但是未能成功。有时候,在调用save()方法时,它会成功地执行或者崩溃,并出现以下通用错误:
发现堆破坏,free list的指针已经受到损坏,地址为0x280a28240 *** 错误的保护值: 13859718129998653044
我已经尝试在DataLogger中通过`.performAndWait()`方法来同步保存(synchronized)数据,但是没有成功。我还尝试使用childContexts方法来实现相同的功能,但也没有成功,以下是相关代码:
let childContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
childContext.parent = context
childContext.hasChanged {
childContext.save();
}
我怀疑我实现DataLogger类的方式不正确,但无法观察到实际问题可能是什么。它可能与创建的对象数量有关,或者可能与线程有关,但我不确定。如何正确实现DataLogger类以确保任何其他类都可以使用它并将实体存储到磁盘上?
persistentContainer
也初始化为lazy
。 - vadian