第二次调用时 fetchRequest 为空

Posted

技术标签:

【中文标题】第二次调用时 fetchRequest 为空【英文标题】:fetchRequest is null when calling second time 【发布时间】: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的代码吗?我觉得它只是被摧毁了,因为本地。 我已经添加了代码和一个演示项目,用于重现链接所附的错误。 【参考方案1】:

我通过更改来修复错误

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

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

【讨论】:

这对我也有用。

以上是关于第二次调用时 fetchRequest 为空的主要内容,如果未能解决你的问题,请参考以下文章

必须从 CoreData 调用 fetch 两次

onCreateView()没有第二次调用

req.session.passport 为空,未调用 deserializeUser - ExpressJS,Passport

Ext JS第二次加载时为空ItemSelector

在使用 FirebaseRecyclerPagingAdapter 时,第二次单击 RecyclerView 中的项目时,片段显示为空

使用 Core Data 进行排序的 fetchRequest 有啥限制?