Правильный способ определить NSManagedObjectContext?

Раньше в своих приложениях с CoreData я определял NSManagedObjectContext следующим образом:

class MyViewController: NSViewController {

    lazy var moc: NSManagedObjectContext? = {
        let app = NSApplication.sharedApplication().delegate as! AppDelegate
        if let moc = app.managedObjectContext {
            return moc
        } else {
            return nil
        }
    }()

    // ....
}

Но потом я скачал образец приложения Apple под названием Eartquakes, и там NSManagedObjectContext было так:

import Cocoa

class CoreDataStackManager {

    class var sharedManager: CoreDataStackManager {
        struct Singleton {
            static let coreDataStackManager = CoreDataStackManager()
        }
        return Singleton.coreDataStackManager
    }

    // persistenStoreCoordinator etc...

И в ViewController:

class ApplesViewController: NSViewController {

    private lazy var managedObjectContext: NSManagedObjectContext = {
        let moc = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)

        moc.persistentStoreCoordinator = CoreDataStackManager.sharedManager.persistentStoreCoordinator

        return moc
    }()
}

Поэтому мне просто интересно, какой путь является правильным - я предполагаю, что это путь Apple :) - и почему Core Data Stack определен в AppDelegate по умолчанию?


person Prontto    schedule 15.05.2015    source источник
comment
Я думаю, что лучше иметь наименьший возможный AppDelegate и конкретный менеджер.   -  person Boris Charpentier    schedule 15.05.2015


Ответы (1)


Есть много способов сделать это, но в конце концов речь идет о ремонтопригодности.

Лучший способ, который я нашел, и он соответствует традиционному подходу Apple к другим элементам:

  1. Создайте отдельный контроллер для Core Data.
  2. Инициализируйте этот контроллер в AppDelegate.
  3. Используйте внедрение зависимостей, чтобы передать этот контроллер в контроллеры представления.

НЕ используйте синглтон. Хотя в начале проекта это кажется легким, позже это может загнать вас в угол.

person Marcus S. Zarra    schedule 15.05.2015
comment
Спасибо за ваш ответ, что Dependency Injection - это новое слово для меня, теперь нужно погуглить :) - person Prontto; 15.05.2015
comment
Это просто означает, что существующий объект передает ссылку на только что созданный объект. AppDelegate передает ссылку на RootViewController, RootViewController передает на следующий контроллер представления и т. д. Не очень сложная концепция. - person Marcus S. Zarra; 15.05.2015