核心数据栈是否应该继承自NSObject?为什么?

时间:2016-05-01 07:35:19

标签: ios swift core-data

最近,将核心数据堆栈实现从app委托移动到另一个类是很常见的。在大多数实现中,我看到核心数据堆继承自NSObject,即使在Apple的文档中也是如此。

  1. 有没有理由呢?没有它似乎没有用。
  2. 为什么Apple的init方法不能调用super.init()不是必须的?
  3. import UIKit
    import CoreData
    
    class DataController: NSObject {
        var managedObjectContext: NSManagedObjectContext
        init() {
            // This resource is the same name as your xcdatamodeld contained in your project.
            guard let modelURL = NSBundle.mainBundle().URLForResource("DataModel", withExtension:"momd") else {
                fatalError("Error loading model from bundle")
            }
            // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model.
            guard let mom = NSManagedObjectModel(contentsOfURL: modelURL) else {
                fatalError("Error initializing mom from: \(modelURL)")
            }
            let psc = NSPersistentStoreCoordinator(managedObjectModel: mom)
            managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
            managedObjectContext.persistentStoreCoordinator = psc
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
                let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
                let docURL = urls[urls.endIndex-1]
                /* The directory the application uses to store the Core Data store file.
                 This code uses a file named "DataModel.sqlite" in the application's documents directory.
                 */
                let storeURL = docURL.URLByAppendingPathComponent("DataModel.sqlite")
                do {
                    try psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil)
                } catch {
                    fatalError("Error migrating store: \(error)")
                }
            }
        }
    }
    

    Initializing the Core Data Stack

1 个答案:

答案 0 :(得分:2)

理论上堆栈可以存在于任何对象中,而在Swift中,该对象不需要从NSObject派生。但实际上它也需要成为所有代码全局可用的单例,而Occam的Razor和时间的需求将始终使应用程序委托一个明显的轨迹,因为它完美地符合该描述,特别是如果那就是你在哪里从Core Data模板创建一个新项目。

  

为什么Apple的init方法不调用super.init()不是必须的?

它由Swift自动完成。