使用 Swift 从库中获取 CoreData 中的 nil managedObjectContext

Getting nil managedObjectContext in CoreData with Swift working from a Library

我正在使用 Swift 5 为 iOS 开发一个库,我希望这个库使用独立于使用该库的应用程序的 CoreData,这就是我所做的远:

  1. 创建了具有各自数据类型的实体
  2. 创建了 .xcdatamodeld 文件,其中包含实体
  3. 创建了一个如下所示的 CoreDataManager
// MARK: - CoreDataManager
final class CoreDataManager {
    static let shared = CoreDataManager()
    private static let defaultObject = NSManagedObject.init()
    
    lazy var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "Audit")
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()
}

问题是我试图通过以下方式获取上下文:

let coreDataManager = CoreDataManager.shared
let context = coreDataManager.persistentContainer.viewContext

context 返回 nil

请帮忙

我解决了它,显然问题是我想使用我的库的 ios 应用程序找不到 .xcdatamodeld 文件这导致了一个无用的 NSPersistentContainer 对象,这也意味着 let context = persistentContainer.viewContext nil.

为了避免将来出现此类麻烦,我将列出使用 CoreData 和 swift 库时的重要注意事项。

需要考虑的关键事项

  1. 确保正在使用您的库的应用知道确切位置 寻找它。可能想看看 this article for details.
  2. 如果您使用 cocoapods 来分发您的库,请确保将以下内容添加到您的 .podspec 中: s.resources = "path/to/model.xcdatamodeld" 这将在您的 Pods 目标中生成一个名为“Resources”的文件夹:

  1. 确保您的模型文件名与 NSPersistentContainer 名称匹配。
  2. (不确定) 我更改了我的 NSManagedObjects 的 class 定义
class Audit: NSManagedObject {}

public class Audit: NSManagedObject {}

即使我不确定这是否有意义,它也可能对您有用。

最后我会留下对我有用的代码

// MARK: - CoreDataManager
final class CoreDataManager {
    static let shared = CoreDataManager()
    private static let defaultObject = NSManagedObject.init()
    
    lazy var persistentContainer: NSPersistentContainer? = {
        let modelURL = Bundle(for: Audit.self).url(forResource: "Audit", withExtension: "momd")
        
        guard let model = modelURL.flatMap(NSManagedObjectModel.init) else {
            print("Fail to load the trigger model!")
            return nil
        }
        
        let container = NSPersistentContainer(name: "Audit", managedObjectModel: model)
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        
        return container
    }()
}

并获取外部上下文

let coreDataManager = CoreDataManager.shared

guard
    let context = coreDataManager.persistentContainer?.viewContext
else {
    print("Nil context case")
    return
}

希望对大家有所帮助!!