2016-11-07 1 views
0

Ich habe eine Datei globals.swiftGlobale Variablen für Core Data Classes (Bad ?, gut?)

Der Code ist sehr einfach und sieht wie folgt genannt.

import Foundation 
import CoreData 
import UIKit 

var g_workOrders = [Workorders]() 
var g_services = [Service]() 

//Shortcut method to get the viewcontext easily from anywhere. 
func gm_getContext() -> NSManagedObjectContext { 
    let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    let context = appDelegate.persistentContainer.viewContext 

    //For unique constraints it will overwrite the data. 
    context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy 

    return context 
} 

Mein Datenmodell ist sehr einfach, es ist ein Arbeitsauftrag, die zu einem ‚Dienst‘ bezeichnet, die in meinem Kontext als Beschreibung gedacht für den Arbeitsauftrag werden können. Arbeitsaufträge können nur einen "Service" haben. Ein "Service" kann zu vielen Arbeitsaufträgen gehören, hat jedoch keine Beziehung zu vielen von ihnen. Es ist also eins zu eins, glaube ich noch.

g_workOrders [] und g_services [] sind NSManagedSubclasses, die ich aus dem Editor-Menü erstellt habe -> createNSManagedSubClasses.

Ich plane, diese Arrays im gesamten Programm zu verwenden, um den aktuellen Status der Arbeitsaufträge zu verfolgen und jederzeit Informationen über einen Dienst zu erhalten. Wenn ich außerdem die globalen Variablen aktualisiere und den Speicher für den Kontext aufruft, sollte die Datenbank gespeichert werden. Das funktioniert derzeit, aber meine Frage ist ... ist das eine gute Praxis?Kann ein unerwartetes Verhalten dadurch entstehen?

Antwort

1

Ihr Ansatz ist vor allem aus zwei Gründen fragwürdig: Es schwächt Speicher, und es hat potenzielle Inkonsistenzen, wenn die DB ändert und Ihre Array-Objekte nicht synchron sind.

Sie sollten NSFetchedResultsController verwenden, wo immer Sie diese Daten benötigen. Core Data wird alle Optimierungen für Sie vornehmen und Ihnen viele Funktionen kostenlos zur Verfügung stellen (z. B. ideal für Tabellenansichten).

Auch eine Ihrer Aussage ist widersprüchlich und auf einen Konstruktionsfehler hinweisen könnte:

A ‚Service‘ kann zu vielen Arbeitsaufträgen gehören, aber nicht über eine Beziehung zu viele von ihnen.

Das ist definitiv falsch. Wenn das gleiche Service zu vielen Workorder s gehören kann, sollte es eine to-many Beziehung zu der Workorder Entität und eine umgekehrte zu-eins Beziehung haben.

+0

Danke für Ihre Antwort, ich hatte dieses Gefühl, ich könnte darüber falsch gehen, aber war mir nicht sicher, warum ... Es würde erscheinen, was Sie bekommen ist Zugriff auf die Daten, so wie ich sie benötige, über coreData-Befehle und Fetch, anstatt zu versuchen, eine globale Variable dafür zu verwenden. Ich denke, ich werde diesen Ansatz versuchen, aber das wirft eine interessante Frage auf. Für jede Tabelle wollte ich einen Verweis auf das 'Objekt' erstellen, das bestimmte Zustände wie 'ein' oder 'aus' enthält. Ich habe darüber nachgedacht, das als Klassenvariable in den Tablecontroller zu setzen, ich frage mich, ob das die gleichen Probleme verursachen würde. –

+0

Der Grund, warum ich sagte, dass der Service zu vielen Arbeitsaufträgen gehören kann, war, weil technisch viele Arbeitsaufträge auf eine Servicevorlage verweisen, aber die Servicevorlage immer nur auf einen Arbeitsauftrag zu einem Zeitpunkt verweist. Dieses Zeug war für mich immer der richtige Weg, es zu tun: P. In meinem Kopf dachte ich, die NSManagedSubclass würde diese Array-Variable auf dem Dienst haben, die keinen Sinn machen würde, dass sie nur eine Variable zu einem Arbeitsauftrag haben sollte. Ist das sinnvoll? –

+0

Klingt wie ein Klassiker zu vielen, wobei ein Dienst mit mehreren Arbeitsaufträgen verbunden ist. Sie sollten eine Servicevariable in Arbeitsreihenfolge und ein Array von workOrders im Service mit einer Verbindung zwischen diesen Attributen haben. – PeejWeej

1

Sie können die Dinge auf diese Weise tun, aber Sie müssen nicht wirklich.

Sie können einfach alle Objekte des gewünschten Typs mit einer Abrufanforderung abrufen, wann immer Sie sie benötigen. CoreData ist hoch optimiert und zwischengespeichert. Wenn Sie also keine extremen Zahlen haben, sollte es keine sinnvolle Wartezeit geben. Auf diese Weise wissen Sie, dass Sie immer alle Instanzen Ihrer Modelle haben, ohne zu versuchen, ihren Zustand an einem anderen Ort zu verwalten.

Auch, wenn Sie eine Verbindung zwischen WorkOrders und Service in der Datenbank haben. (was Sie sollten), Sie müssen auf jeden Fall keine Arrays von beiden zu halten.

+0

Dank dieser half mir wirklich die Richtung zu gehen –