2016-05-01 4 views
0

Kürzlich ist es üblich, die Core Data Stack-Implementierung vom App-Delegaten in eine andere Klasse zu verschieben. In den meisten Implementierungen sehe ich, dass der Core-Datenstapel sogar in der Apple-Dokumentation von NSObject erbt.Sollte Core Data Stack von NSObject erben und warum?

  1. Gibt es einen Grund dafür? Es scheint ohne zu funktionieren.
  2. Warum Apples init-Methode nicht aufrufen super.init() ist es nicht ein Muss?

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

+0

"Es ist üblich, die Core Data Stack-Implementierung vom App-Delegaten in eine andere Klasse zu verschieben. Kannst du ein Beispiel geben? – matt

+0

Sicher, ich habe Apples Codebeispiel ihres CDS aka DataController hinzugefügt – twofish

+0

Sieht das die Projektvorlagen auch so aus? Verwenden sie ein DataController-Objekt, das sich von AppDelegate unterscheidet? – matt

Antwort

1

Der Stapel in jedem Objekt in der Theorie leben kann, und in Swift das Objekt ableiten muss nicht von NSObject. Aber in Wirklichkeit muss es auch ein Singleton sein, der global für jeden Code verfügbar ist, und die Anforderungen von Ockhams Razor und der Zeit werden den App-Delegierten immer zu einem offensichtlichen Locus machen, da er diese Beschreibung perfekt erfüllt, und vor allem, wenn es bei dir ist Erstellen Sie ein neues Projekt aus den Core Data-Vorlagen.

Warum Apples init-Methode nicht aufrufen super.init() ist es nicht ein Muss?

Es wird automatisch von Swift selbst durchgeführt.

+0

Aber ich ermutige Sie, Singleton zu implementieren und dies richtig zu tun. Und wenn Sie dies tun, müssen Sie nicht von NSObject in Swift ableiten. – matt

+0

"Es wird automatisch von Swift selbst gemacht." Wie kannst du das Wissen? – twofish

+0

Ich kann es sehen, mit symbolischen Haltepunkten. Auch hier ist es gut dokumentiert. Plus wurde mir direkt von jemandem bei Apple erzählt. Ich habe einen Fehler dagegen, weil ich kein geheimes Verhalten dieser Art mag. – matt