У меня есть некоторый проект iOS (Project
) с методом @escaping
в AppDelegate
, который используется для создания NSPersistentContainer
для этого проекта.Этот метод затем вызывается в методе didFinishLaunchingWithOptions
следующим образом:
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var persistentContainer: NSPersistentContainer!
func createProjectContainer(completion: @escaping (NSPersistentContainer) -> ()) {
let container = NSPersistentContainer(name: "Project")
container.loadPersistentStores { (_, error) in
guard error == nil else { fatalError("Failed to load store: \(error!)") }
DispatchQueue.main.async { completion(container) }
}
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
createProjectContainer { container in
self.persistentContainer = container
let storyboard = self.window?.rootViewController?.storyboard
guard let vc = storyboard?.instantiateViewController(withIdentifier: "NavigationController") as? NavigationController else {
fatalError("Cannot instantiate root view controller")
}
vc.managedObjectContext = container.viewContext
self.window?.rootViewController = vc
}
return true
}
}
Класс NavigationController
является просто подклассом UINavigationController
, который включает UIViewController
(ChildViewController
) и имеетпеременная NSManagedObjectContext
(managedObjectContext
), которую я хочу передать первому ChildViewController
:
class NavigationController: UINavigationController {
var managedObjectContext: NSManagedObjectContext!
override func viewDidLoad() {
super.viewDidLoad()
guard let vc = self.childViewControllers.first as? ChildViewController else { fatalError("") }
vc.managedObjectContext = managedObjectContext
print("NavigationController: viewDidLoad")
print("managedObjectContext ---> \(managedObjectContext)")
}
}
Теперь print("NavigationController: viewDidLoad")
, кажется, вызывается дважды.При первом вызове managedObjectContext = nil
, при втором вызове он был назначен.Имеет ли это значение, что приложение загружается дважды?
Похоже, что это происходит во время storyboard?.instantiateViewController(withIdentifier: "NavigationController")
, который называется после , когда NavigationController
был загружен впервые из-за@escaping
свойство замыкания.Однако, если я исключу эту строку, так как просто получаю ссылку на NavigationController
, managedObjectContext
, кажется, никогда не будет назначен.