2014-01-10 6 views
7

Ich brauche deine Hilfe bei etwas, wie ich nicht meinen Kopf herumkommen kann. Ich verwende Mantle zusammen mit CoreData in iOS.Verwenden von Mantle mit Core Data - NSSet und NSArray

I definiert haben Beziehungen, die wie folgt aussehen:

Beitrag 1: N Kommentar

Wenn ich die Daten von meinem REST-Service ziehen, erstelle ich einen Mantel Objekt Beitrag, der ein NSMutableArray von Kommentaren in ihm . Das funktioniert einwandfrei.

Ich dann speichern dies in Core Data, und das ist, wo ich nicht weiß, ob ich Dinge richtig mache.

[MTLManagedObjectAdapter managedObjectFromModel:post insertingIntoContext:[self getManagedObjectContext] error:&error]; 

So mache ich das in Core Data meinen Beitrag Objekt zu speichern. Das Kerndatenmodell hat eine Beziehung namens "post_has_comments", die eine kaskadierende Eins-zu-Viele-Beziehung ist. Also auf dem Objekt Post habe ich "posts_has_comments" -> cascading, auf meinem Objekt "Comment" habe ich eine Eins-zu-Eins-Beziehung mit "Nullify".

Afaik behandelt Core Data dies als NSSet. Was ich versuche, ist ein NSMutableArray obwohl, wie Mantle sich darum kümmern wird (zumindest was ein kurzer Blick in seiner Quelle mir sagte).

Leider, wenn ich das Objekt wieder von Core Data mit

Post* post = [MTLManagedObjectAdapter modelOfClass:Post.class fromManagedObject:[[self fetchedResultsController] objectAtIndexPath:indexPath] error:nil]; 

Die Eigenschaft Kommentare zum Post-Objekt erhalten, ist eine leere NSSet, und ich einige ziemlich Fehler auf das Ding vorher einlegen. Die Fehler, die ich bekomme:

Core Data: annotation: repairing missing delete propagation for to-many relationship post_has_comments on object [...] 

Ich bin fest - Vielleicht fehlt mir etwas riesiges hier?

My Post Klasse implementiert die folgenden statischen Methoden:

+ (NSDictionary *)managedObjectKeysByPropertyKey { 
return @{ 
     @"post_id" : @"id", 
     @"comments" : @"post_has_comments" 
     }; 
} 

+ (NSDictionary *)JSONKeyPathsByPropertyKey { 
    return @{ 
      @"post_id" : @"id", 
      }; 
} 

+ (NSDictionary *)relationshipModelClassesByPropertyKey { 
    return @{ 
      @"comments" : IHComment.class 
      }; 
} 
+0

hast du das gelöst? – onmyway133

+0

Irgendwelche Updates zu diesem Thema? –

+0

Sie können meine Antwort auf die angenommene Antwort überprüfen - Allerdings weiß ich nicht, wie das heute gilt, wie dies vor über zwei Jahren jetzt ist. – Elysium

Antwort

-5

aus dem Mantel Dokumentation:

Mantle makes it easy to write a simple model layer for your Cocoa or Cocoa Touch application.

Das ist einfach eine unbewiesene Behauptung. Wenn ich den Rahmen betrachte, sehe ich nicht, wo die Beweise sind. Sie sollten Ihre Objekte abrufen und sie mit Apple's APIs in Core Data einfügen.

Post *cdPost = [NSEntityDescription insertNewObjectForEntityForName:@"Post" 
    inManagedObjectContext:self.managedObjectContext]; 
// configure the cdPost object with the data from the web service 
for (id commentObject in commentArrayFromPostObject) { 
    Comment *cdComment = 
     [NSEntityDescription insertNewObjectForEntityForName:@"Comment" 
     inManagedObjectContext:self.managedObjectContext]; 
    // configure the cdComment object with the data from the web service 
    cdComment.post = cdPost; 
} 

Das ist alles, was es ist.

+0

Nun, die Antwort ist nicht ganz richtig, aber zeigte mir in die richtige Richtung. Ich fand heraus, dass während Mantle CoreData unterstützt, hat es seine Probleme und Vorbehalte mit umgekehrten Beziehungen in CoreData. Eine Lösung besteht darin, dies einfach selbst zu verwalten oder die Verwendung von Mantle zu vermeiden, bis weitere Verbesserungen vorgenommen werden. Auch hatte ich einen wirklich fiesen Bug Serveride und Mantle in Kombination mit CoreData stolperte wirklich sehr schlecht, ohne irgendwelche Ausnahmen zu geben. :( – Elysium

+0

Ich lese meinen Code noch einmal durch - nur aus Interesse: was genau ist nicht ganz richtig? – Mundi

+0

Der Code ist völlig in Ordnung. "Sie sollten Ihre Objekte erhalten, und fügen Sie sie in Core Data mit Apple's APIs." Mantle bietet hierfür eigene Schnittstellen: '[MTLManagedObjectAdapter managedObjectFromModel: car insertingIntoContext: self.masterManagedObjectContext Fehler: NULL];' Dies ermöglicht es, auch Mantle-Objekte aus Core Data zu holen, was für diese Objekte nützlich ist dann einfach über Mantle zu JSON serialisieren – Elysium

0

Eine einfache Abhilfe ist Ihr Eigentum Setter-Methode zu schreiben, und wenn der Wert festgelegt wird, ist NSSet dann zu NSMutableArray konvertieren, bevor es zurück zu Ihrem Objekt ivar Einstellung.

Zum Beispiel:

- (void)setComments:(NSMutableArray *)comments { 
    if ([comments isKindOfClass:NSSet.class]) { 
     _comments = [NSMutableArray arrayWithArray:[((NSSet *)comments) allObjects]]; 
    } else { 
     _comments = comments; 
    } 
} 

Ich habe es getan, mich ein paar Mal und es wirkt wie ein Zauber!