2017-03-02 2 views
0

Ich arbeite mit RestKit 0.27.0 und habe es geschafft, meinen Core Data Stack fast genau so einzurichten wie im TwitterCoreData Beispiel in RestKits GitHub.RestKit putObject - sollte es Persistenz für mich in den Core Data Store zurückbringen?

Ich habe auch GET/POST-Anforderungen zugeordnet, die die Objekte in Core Data korrekt beibehalten, obwohl ich Probleme mit meiner PUT-Anfrage habe.

Es scheint, dass meine PUT-Anfrage das Objekt auf dem Server korrekt aktualisiert, und ich kann es in der Antwort aktualisiert sehen. Ich gehe dann, um den SQLite DB Viewer zu aktualisieren und zu erwarten, dass die Entity aktualisiert wurde, aber nicht.

Nehmen Sie addressLine1 zum Beispiel, es wurde eingestellt: "4 einige Adresse". Ich aktualisiere es dann auf "4 TEST THIS CHANGE" auf dem NSManagedObject und übergebe es als das Objekt auf dem PUT.

I kann das folgende in den Protokollen siehe:

2017-03-02 15: 05: 18,006 Albert [41779: 1.232.025] T restkit.object_mapping: RKMappingOperation.m: 748 übersprungene Kartierung von Attributwert von keyPath ‚AddressLine1 zu keyPath‚AddressLine1‘ - Wert ist unverändert (4 kann diese Veränderung)

Es ist fast, als ob, weil ich den AddressLine1 Wert auf dem NSManagedObject aktualisiert haben, dass RestKit nicht nehmen Sie es als eine Änderung auf?

Wenn ich mich in meine App zurückmelde, führt sie eine GET-Anfrage aus und wenn sie das Objekt erhält, erkennt sie, dass es einen Unterschied zwischen dem transienten Objekt und der in CoreData gespeicherten Entität gibt und aktualisiert es erfolgreich.

Ich kann kein putObject finden: Dokumentation, die mir helfen kann zu verstehen, wo ich falsch liege, basierend auf der neuesten Version von RestKit (0.27.0 zum Zeitpunkt des Schreibens) - Es wäre gut zu sein mit einem Beispiel versehen oder auf ein Beispiel verwiesen, das mit der Referenzierung eines vorhandenen NSManagedObject beginnt, eine Eigenschaft (ein Attribut) darauf aktualisiert und sie dann als Argument in der PUT-Anforderung sendet. Ich stelle mir vor, dass RestKit die Persistenz von Core-Daten für mich übernehmen sollte, so wie es bei den GET- und POST-Anfragen der Fall ist.

Antwort

0

Es sieht so aus, als hätte ich nicht verstanden, wie RestKit mit CoreData arbeitet.

Ursprünglich machte ich zuerst das erforderliche Update zum Objekt und dann so tun die PUT-Anfrage:

[[RKObjectManager sharedManager] putObject:myObjectWithChanges 
           path:path 
           parameters:nil 
    success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 

ich davon aus, dass es die NSManagedObject mit Änderungen, indem man, wäre es korrekt funktionieren. Es hat den Server zwar aktualisiert, aber es würde vermasseln, wenn es darum ging, die Entität in CoreData zu aktualisieren - Scheint, dass RestKit angenommen hat, dass es bereits auf dem neuesten Stand ist, weil ich das lokale NSManagedObject aktualisiert habe.

Anstatt also habe ich beschlossen, zu versuchen und zu Null für das Objekt zu verwenden und die Änderungen als Wörterbuch in Parametern übergeben (es nicht erforderlich ist, ein Objekt in RestKit zur Verfügung zu stellen, wenn Sie einen Weg anbieten):

NSDictionary *dict = @{ 
         @"addressLine1":@"4 TEST THIS CHANGE 11", 
         @"addressLine2":@"Address line 2", 
         @"postCode":@"WN7 5GB" 
         }; 

[[RKObjectManager sharedManager] putObject:nil   
           path:path 
           parameters:dict 
    success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 

Mit diesem für die PUT mir erlaubt, sowohl das Objekt auf dem Server und die lokale Entität in Core Data zu aktualisieren.

Ich kann nur annehmen, das "Objekt" in putObject: ist nur RestKit zu sagen, welches Objekt es ist, so dass RestKit die entsprechenden Anfrage/Antwort-Deskriptoren für das Routing auswählen kann. Es ist das parameters: Argument, das alle für das Objekt vorgenommenen Änderungen vornehmen muss.

HINWEIS: Es ist auch in Ordnung Ihr Objekt in den Ruf zu setzen wie so:

NSDictionary *dictWithChanges = @{ 
             @"addressLine1":@"Change here" 
            }; 

    [[RKObjectManager sharedManager] putObject:myObjectWithoutChanges   
            path:path 
            parameters:dictWithChanges 
     success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 

Es scheint, dass RestKit Änderungen an den Parametern mit dem Objekt verschmelzen und die Anforderung rekonstruieren.