在Cocoa中,Storyboard的第一个视图控制器会在调用viewDidLoad
AppDelegate
之前调用applicationDidFinishLaunching
(在第一个视图控制器上)。
由于我抓取NSManagedObjectContext
中的applicationDidFinishLaunching
,我需要在加载数据之前等待applicationDidFinishLaunching
。
换句话说,在viewDidLoad
中,我还没有NSManagedObjectContext
。
我现在在做什么:
我在applicationDidFinishLaunching
添加viewDidLoad
观察者,并在触发数据时加载数据。
所以(按顺序):
1. ViewController正在添加applicationDidFinishLaunching
观察者
2. AppDelegates运行其applicationDidFinishLaunching
并触发观察者
3.我可以从ViewController加载数据。
我意识到我viewDidLoad
之前<{>> 要在applicationDidFinishLaunching
之前调用。如果更改了该顺序,则会在applicationDidFinishLaunching
之后添加观察者,并且不会加载数据。
它会更安全吗?让我的CoreDataManager&#39;从AppDelegate直接在其NSManagedObjectContext
?
init
答案 0 :(得分:1)
我建议修改一下设计,从AppDelegate类中删除任何核心数据的使用,然后将任何初始化移动到根视图控制器中,然后使用依赖注入将托管对象上下文传递给其他视图控制器(或者具有单独的核心数据管理器类实现为单例)。这将使您摆脱这样的问题。
答案 1 :(得分:0)
Joakim Danielson在这里提供的答案就是我最终做的事情(信用到期的信用)。
<强> - 修改
完全按照Joakim Danielson的建议行事。获取上下文的给定代码默认情况下可能在AppDelegate
,但它完全独立。它可以在任何地方移动。
我基本上将以下函数移到我的CoreDataManager
课程中,并且我在init()
中调用它:
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "AppName")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error {
// Replace this implementation with code to handle the error appropriately.
fatalError("Unresolved error \(error)")
}
})
return container
}()
另外,不要忘记saveContext()
中的AppDelegate
需要更新(默认情况下,它指向自己的getter)。
(上一个回答:)
我已经(稍微)将lazy var persistentContainer: NSPersistentContainer
中提供的签名AppDelegate
(通过在创建项目时检查CoreData
)更改为:static var persistentContainer: NSPersistentContainer
。
static var coreDataContext: NSManagedObjectContext = {
let container = NSPersistentContainer(name: "AppName")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error {
// Replace this implementation with code to handle the error appropriately.
fatalError("Unresolved error \(error)")
}
})
return container.viewContext
}()
我的CoreDataManager
(单身),现在可以使用此init:
class CoreDataManager {
static let shared = CoreDataManager()
weak var context: NSManagedObjectContext!
init() {
self.context = AppDelegate.coreDataContext
}
使用此模式(在AppDelegate
中):
static var coreDataContext: NSManagedObjectContext = {...}()
确保该块只执行一次。
现在,在任何阶段使用NSManagedObjectContext
都是安全的。