Swift: передача managedObjectContext из AppDelegate в UINavigationController - PullRequest
0 голосов
/ 28 мая 2018

У меня есть некоторый проект 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, кажется, никогда не будет назначен.

...