我在将Core Data实现到我的Swift IOS应用程序中。持久性管理器是通过单例模式创建的。以下是描述它的代码/uff1a
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)")
}
}
}
}
}
现在/uff0c如果我使用以下代码创建一个包含我的实体的大约1000个元素/uff08MyEntity是Core Data实体对象/uff09的循环/uff0c则应用程序崩溃。
class MySampleClass {
static func doSomething {
for i in 0 ..< 1000 {
let entry = MyEntity(context: DataLogger.shared.context);
// do random things
}
DataLogger.shared.save()
}
}
它在MyEntity上崩溃/uff08context/uff1aDataLogger.shared.context/uff09/uff0c我无法观察任何日志来查看原因。有时/uff0c它会到达save/uff08/uff09调用并成功或崩溃/uff0c并指出/uff1a
检测到堆损坏/uff0c免费列表损坏在0x280a28240 ***不正确的保护值/uff1a13859718129998653044
我试图环顾网络/uff0c找到关于问题可能是什么的任何提示。我试图通过.performAndWait/uff08/uff09使DataLogger中的save/uff08/uff09方法同步/uff0c但没有成功。我还尝试使用childContexts来执行相同的操作/uff0c但没有成功/uff0c通过以下代码/uff1a
let childContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
childContext.parent = context
childContext.hasChanged {
childContext.save();
}
我怀疑我正在错误地实现DataLogger类/uff0c但无法观察到实际问题。它可能与创建的对象的数量有关/uff0c或者可能与线程有关/uff0c但我不确定。实现DataLogger类以确保任何其他类可以使用它并
其实将实体存储到磁盘的正确方法是
class MySampleClass {
let dataLogger = DataLogger.shared
let context = dataLogger.context
static func doSomething {
for i in 0 ..< 1000 {
let entry = MyEntity(context: context);
// do random things
}
dataLogger.save()
}
}
通过DataLogger
在类中实例化一次Singleton引用并将属性设置为其上下文/uff0c将持有一个本地引用/uff0c该引用应该将重复的调用保存回您的DataLogger
类。
本文由 投稿者 创作,文章地址:https://blog.isoyu.com/archives/zaiswift-5zhongpeizhihexinshujuchijiuxing.html
采用知识共享署名4.0 国际许可协议进行许可。除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为:8 月 29, 2019 at 02:37 下午