【问题标题】:fetchRequest is null when calling second time第二次调用时 fetchRequest 为空
【发布时间】:2020-07-16 14:08:28
【问题描述】:

代码是

let request: NSFetchRequest<NSFetchRequestResult> = Item.fetchRequest()
print(request)

Item 是 Core Data 的一个实体。

第一次执行正确,但再次执行时出现错误Thread 12: EXC_BAD_ACCESS (code=1, address=0x0)

以下是日志:

这是一个类似的question,但使用对象C。它说直接在视图控制器中定义managedObjectContext而不是从AppDelegate转移它可以修复错误。

在我的代码中,managedObjectContextSceneDelegate 中。

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    if let windowScene = scene as? UIWindowScene {
        let context = CoreData.stack.context
        let window = UIWindow(windowScene: windowScene)
        window.rootViewController = UIHostingController(rootView: ContentView()
            .environment(\.managedObjectContext, context)
            .environmentObject(UserEnvironment())
    )
        self.window = window
        window.makeKeyAndVisible()
    }
}

import CoreData

class CoreData: NSObject {
    
    static let stack = CoreData() 

    public var context: NSManagedObjectContext {
        
        get {
            return self.persistentContainer.viewContext
        }
    }

    private lazy var persistentContainer: NSPersistentCloudKitContainer = {
        
        let container = NSPersistentCloudKitContainer(name: "iCloud.com.xxxx")
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let nserror = error as NSError? {
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            }
        })
        
        container.viewContext.automaticallyMergesChangesFromParent = true
        container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
        
        return container
    }()
}

那么如何修复 Swift 中的 bug?谢谢。

【问题讨论】:

  • 你能显示CoreData.stack的代码吗?我觉得它只是被摧毁了,因为本地。
  • 我已经添加了代码和一个演示项目,用于重现链接所附的错误。

标签: ios objective-c swift core-data swiftui


【解决方案1】:

我通过更改来修复错误

let request: NSFetchRequest&lt;NSFetchRequestResult&gt; = Item.fetchRequest()

let request: NSFetchRequest&lt;NSFetchRequestResult&gt; = NSFetchRequest&lt;NSFetchRequestResult&gt;.init(entityName: "Item")

【讨论】:

  • 这对我也有用。
猜你喜欢
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
  • 2016-10-03
相关资源
最近更新 更多