Cara yang benar untuk mendefinisikan NSManagedObjectContext?

Sebelumnya di aplikasi saya dengan CoreData saya biasa mendefinisikan NSManagedObjectContext saya dengan cara ini:

class MyViewController: NSViewController {

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

    // ....
}

Tapi kemudian saya mengunduh contoh aplikasi Apple bernama Eartquakes dan di sana NSManagedObjectContext seperti itu:

import Cocoa

class CoreDataStackManager {

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

    // persistenStoreCoordinator etc...

Dan di ViewController:

class ApplesViewController: NSViewController {

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

        moc.persistentStoreCoordinator = CoreDataStackManager.sharedManager.persistentStoreCoordinator

        return moc
    }()
}

Jadi saya hanya ingin tahu cara mana yang benar - saya berasumsi itulah cara Apple :) - dan itulah mengapa Core Data Stack didefinisikan di AppDelegate secara default?


person Prontto    schedule 15.05.2015    source sumber
comment
Saya pikir lebih bersih memiliki AppDelegate sekecil mungkin, dan manajer khusus.   -  person Boris Charpentier    schedule 15.05.2015


Jawaban (1)


Ada banyak cara untuk melakukan hal ini, namun pada akhirnya yang terpenting adalah pemeliharaan.

Cara terbaik yang saya temukan dan sejalan dengan pendekatan tradisional Apple terhadap item lainnya adalah:

  1. Buat pengontrol terpisah untuk Data Inti.
  2. Inisialisasi pengontrol itu di AppDelegate.
  3. Gunakan Injeksi Ketergantungan untuk meneruskan pengontrol itu ke pengontrol tampilan.

JANGAN gunakan Singleton. Meskipun terasa mudah di awal sebuah proyek, hal itu cenderung membuat Anda terpojok di kemudian hari.

person Marcus S. Zarra    schedule 15.05.2015
comment
Terima kasih atas jawaban Anda, Injeksi Ketergantungan itu adalah kata baru bagi saya, harus mencarinya di Google sekarang :) - person Prontto; 15.05.2015
comment
Artinya objek yang ada meneruskan referensi ke objek yang baru saja dibuat. AppDelegate meneruskan referensi ke RootViewController, RootViewController meneruskan ke pengontrol tampilan berikutnya, dll. Bukan konsep yang sangat rumit. - person Marcus S. Zarra; 15.05.2015