วิธีที่ถูกต้องในการกำหนด 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 เป็นคำศัพท์ใหม่สำหรับฉัน ต้อง Google เลย :) - person Prontto; 15.05.2015
comment
หมายความว่าวัตถุที่มีอยู่ผ่านการอ้างอิงไปยังวัตถุที่เพิ่งสร้างขึ้น AppDelegate ส่งผ่านการอ้างอิงไปยัง RootViewController, RootViewController ส่งผ่านไปยังตัวควบคุมมุมมองถัดไป ฯลฯ ไม่ใช่แนวคิดที่ซับซ้อนมาก - person Marcus S. Zarra; 15.05.2015