源码

在Swift 5中配置核心数据持久性

我在将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类。

(0)

本文由 投稿者 创作,文章地址:https://blog.isoyu.com/archives/zaiswift-5zhongpeizhihexinshujuchijiuxing.html
采用知识共享署名4.0 国际许可协议进行许可。除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为:8 月 29, 2019 at 02:37 下午

热评文章