第二次调用时 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
转移它可以修复错误。
在我的代码中,managedObjectContext
在SceneDelegate
中。
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<NSFetchRequestResult> = Item.fetchRequest()
到
let request: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest<NSFetchRequestResult>.init(entityName: "Item")
【讨论】:
这对我也有用。以上是关于第二次调用时 fetchRequest 为空的主要内容,如果未能解决你的问题,请参考以下文章
req.session.passport 为空,未调用 deserializeUser - ExpressJS,Passport
在使用 FirebaseRecyclerPagingAdapter 时,第二次单击 RecyclerView 中的项目时,片段显示为空