2012-04-14 6 views
2

Ich verwende CoreData in meiner Anwendung. Ich möchte alle mit CoreData zusammenhängenden Sachen als API abstrahieren, so dass der Konsument die API verwenden kann, anstatt CoreData und seine generierten Modellobjekte direkt zu verwenden. Coredata erzeugt das verwaltete Objekte Modell wie folgtCoreData Model Objects für API

@interface Person : NSManagedObject 

@end 

ich meine API zum Beispiel MyApi definieren möchten, und es hat eine Funktion namens als

createPerson:(Person*)p; 

So der Verbraucher dieser createPerson API braucht eine Person zu erstellen Datenobjekt (wie POJO in Java World) und rufen Sie diese API auf. Aber ich kann nicht Person erstellen Objekt mit

Person *p = [Person alloc] init] 

weil der designierte initializer für diese Person Modell von Coredata erstellt nicht diese Art der Erzeugung ermöglichen.

Also sollte ich definieren, dass entsprechende Benutzer zugewandten Datenobjekt PersonDO sein kann und diese API sollte dies statt nehmen, um die Daten in die API-Implementierung zu tragen?

Ist meine Vorgehensweise richtig? Irgendwelche Experten beraten, wenn Entwurf die API auf diese Weise ein gutes Entwurfsmuster ist?

Antwort

2

Sie können CoreData nicht verwenden, ohne mit Managed Object Context zu arbeiten. Sie MUSS die Person aus dem Kontext abrufen und im Kontext speichern. Wenn Sie nicht möchten, dass Ihr Kunde damit klarkommt und Sie keine anderen Threads in Ihrer App verwenden, können Sie eine API erstellen, die den verwalteten Objektkontext Ihres AppDelegate aufruft und der Benutzer nur noch tun muss diese Methode aufrufen.

Zum Beispiel Sie automatisch von Core Data Methoden erzeugt nutzen könnten Ihre API so zu machen:

+ (Person *)newPersonWithAttributes:(NSDictionary *)userInfo { 

    // Call the designated initializer, but customer 
    // doesn't need to think about managed object context 
    return [Person initPesonWithAttributes:userInfo 
        inManagedObjectContext:[[AppDelegate sharedAppDelegate] managedObjectContext]]; 
} 
+0

Sieht aus wie das soll eine Klassenmethode sein. Ersetzen Sie '-' durch '+'. –

+0

Außerdem muss es viele andere Dinge geben ... nicht praktisch, es sei denn, Sie fügen Kategorien zu NSManagedObject hinzu, so dass "save" für den Kontext zusätzlich zu anderen Dingen aufgerufen wird. –

+0

Ja, es sollte zu categorey hinzugefügt werden, sowohl mit speichern, löschen, und all die anderen Sachen –

1

Sie müssen viele Sachen zu abstrahieren, dass aus. RestKit stellt dafür Mechanismen zur Verfügung. Ein leichteres Gewicht wäre InnerBand (siehe Tutorial InnerBand CoreData) - obwohl Threads/Queues für Multithreads nicht automatisch ermittelt werden.

Allerdings ist es eine sehr einfache API, und sollte Ihnen das meiste geben, was Sie wollen.