La domanda che mi pongo, nel tuo caso, è "a chi appartiene lo stack di dati principali"? Lo stesso dato è in realtà provincia dell'applicazione, vero? (CF Core Data su Mac, in cui è possibile avere un'applicazione in grado di lavorare con più documenti alla volta, quindi lo stack Core Data appartiene a ciascun documento.)
In qualsiasi applicazione Cocoa/Cocoa Touch, il delegato dell'app. di solito è il mezzo preferito per personalizzare il comportamento dell'applicazione, quindi questo è il posto naturale per lo stack di Core Data.
Ora, il problema che ho il sospetto che stai avendo è che ci si sente sbagliato a scrivere costantemente cose come:
NSManagedObjectContext *context = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
Quello che di solito faccio in questi casi è funzioni (non i metodi) come questo scrivere:
NSManagedObjectContext *UIAppManagedObjectContext() {
return [*(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}
Scrivo una funzione simile per NSPersistentStoreCoordinator
e NSManagedObjectModel
. Ho inserito tutti questi file nel file .h/.m del Delegato dell'app, poiché anche questi sono oggetti a livello di applicazione.
Non usare l'iniezione delle dipendenze è stato sicuramente un cattivo progetto quando ho iniziato a utilizzare i dati principali. Recentemente, prendo lo stesso approccio che hai delineato. La differenza principale è che ho inserito il codice di stack dei dati core in una categoria sul contesto NSManagedObject, se non altro per separare logicamente il codice dello stack dei dati principali da AppDelegate. In teoria, potrei usare la categoria come un singleton, ma scelgo di non farlo perché introduce "rigidità delle applicazioni" come hai detto tu. Inoltre, utilizzo un codice personalizzato per lo stack di Core Data e questo mi consente di rilasciare facilmente questo codice in nuovi progetti. –
Sono con voi per l'utilizzo del Delegato app per la creazione dello stack Core Data. Sto usando un UITabBarController come controller della vista radice, e non sono sicuro di come propagare il contesto a quell'oggetto controller, poiché vive in MainWindow.xib e non sono sicuro di come assegnarlo a un ManagedObjectContext. Penso di pubblicare una domanda a parte per questo. – mvexel
Quel documento Apple dice: "Quando si crea un controller di visualizzazione, si passa il contesto che dovrebbe utilizzare." ma non vedo come questo sia fatto. Il controller della vista principale viene creato tramite lo storyboard, se si utilizza uno storyboard, giusto? Quindi, come passare il contesto? –