2012-12-06 10 views
8

Ich bin gespannt, was der beste Weg ist, ein neues NSManagedObject in RestKit 0.20 zu erstellen? Derzeit sieht mein Code in etwa so aus:RestKit 0.20 - Was ist der bevorzugte Weg, um ein neues NSManagedObject zu erstellen?

#pragma mark - navigation buttons 

- (void)createButtonDidTouch 
{ 
    // create new album object  
    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 
    NSManagedObjectContext *parentContext = RKObjectManager.sharedManager.managedObjectStore.mainQueueManagedObjectContext; 
    context.parentContext = parentContext; 
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Album" inManagedObjectContext:parentContext]; 
    Album *newAlbum = [[Album alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:context]; 

    // pass object to create view to manipulate 
    AlbumCreateViewController *createViewController = [[AlbumCreateViewController alloc] initWithData:newAlbum]; 
    createViewController.delegate = self; 
    createViewController.managedObjectContext = context; 

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:createViewController]; 
    navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 

    [self presentViewController:navController animated:YES completion:nil]; 
} 

#pragma mark - create view controller delegate 

- (void)createViewControllerDidSave:(NSManagedObject *)data 
{ 
    // dismiss the create view controller and POST 

    // FIXME: add restkit code to save the object 
    NSLog(@"save the object..."); 

    NSDictionary *userInfo = [KeychainUtility load:@"userInfo"]; 
    NSString *path = [NSString stringWithFormat:@"/albums/add/%@/%@", userInfo[@"userID"], userInfo[@"apiKey"]]; 

    [RKObjectManager.sharedManager postObject:data path:path parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
     operation.targetObject = data; 
    } failure:^(RKObjectRequestOperation *operation, NSError *error) { 
     NSLog(@"create album error: %@", error); 
    }]; 

    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

- (void)createViewControllerDidCancel:(NSManagedObject *)data 
{ 
    // dismiss the create view controller 

    NSLog(@"delete the object..."); 
    // FIXME: add restkit code to delete the object 

    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

Ich bin auch neugierig zu wissen, was meine Verantwortlichkeiten für das Speichern/Löschen dieses Objekts sind. Wenn ich über RestKit den Server anmelde, wird der Kontext des verwalteten Objekts gespeichert?

Was passiert, wenn ich diesen Erstellungsprozess abbrechen möchte - was ist die bevorzugte Methode, um dieses Objekt zu löschen?

Grundsätzlich, wie viel tut RestKit für mich, und was soll ich tun, um sicherzustellen, dass ich es tue. Ich habe dazu nicht viel Dokumentation gefunden und möchte es klarstellen.

Antwort

11

Wenn Sie ein RKManagedObjectRequestOperation für ein bestimmtes Objekt zu initialisieren, RestKit wird eine permanente Objekt-ID für das Objekt erhalten, und dann ein Kind verwaltete Objektkontext Kontext deren Eltern schafft, ist der Kontext des Objekt in eingeführt wird. Die Operation führt dann die HTTP-Anforderung zum Abschluss aus und erhält eine Antwort.

Wenn die Antwort erfolgreich ist und die Zuordnung der Antwort erfolgreich ist (beachten Sie, dass die Zuordnung in diesem privaten untergeordneten Kontext erfolgt), wird der private untergeordnete Kontext gespeichert. Der Typ der aufgerufenen Sicherung wird durch den Wert der Eigenschaft savesToPersistentStore festgelegt (siehe http://restkit.org/api/0.20.0/Classes/RKManagedObjectRequestOperation.html#//api/name/savesToPersistentStore).

Wenn YES, der Kontext rekursiv den ganzen Weg zurück zu dem persistenten Speicher über die Methode NSManagedObjectContext Kategorie gespeichert saveToPersistentStore (siehe http://restkit.org/api/0.20.0/Categories/NSManagedObjectContext+RKAdditions.html).

Wenn NO, der Kontext wird gespeichert über eine Vanille [NSManagedObjectContext save:] Nachricht, die die Änderungen zurück in den übergeordneten Kontext "schiebt". Sie bleiben lokal in diesem Kontext, bis Sie sie wieder speichern. Beachten Sie, dass Übergeordnete/untergeordnete Hierarchien für verwaltete Objektkontexte so lang sein können, wie Sie innerhalb der Anwendung erstellen.

Wenn die HTTP-Anforderung fehlgeschlagen ist oder während des Zuordnungsprozesses ein Fehler aufgetreten ist, wird der private Kontext nicht gespeichert, und die Operation gilt als fehlgeschlagen. Dies bedeutet, dass keine Änderungen im ursprünglichen MOC gespeichert werden und das Objektdiagramm so bleibt, wie es vor dem Start der Operation war (außer das Objekt, das gesendet wird, wenn es temporär ist, jetzt eine permanente Objekt-ID besitzt, aber noch nicht gespeichert ist).

+0

Wie würde ich dieses Objekt dann löschen - vorausgesetzt, ich habe das Objekt mit dem obigen Code erstellt, aber nicht die POST-Anfrage ausgelöst - eher abgebrochen/schließen Sie die "create" View-Controller? Nur durch meinen lokalen NSMangedObjectContext? –

+3

Im obigen Code wurde es in den Kontext eingefügt, aber nicht gespeichert. Sie könnten es aus dem Kontext löschen, wenn der View-Controller nicht mehr angezeigt wird. Aber ich würde empfehlen, dass Sie ** NOT ** Objekte direkt in den "managedObjectStore.mainQueueManagedObjectContext" einfügen, aber stattdessen einen untergeordneten verwalteten Objektkontext erstellen, wenn Sie zum Erstellungscontroller übergehen und ihn dem Controller zuweisen. Was Sie dann tun können ist, lassen Sie die MOC dealloc, wenn Sie abbrechen. –

+0

Gibt es eine Verknüpfung zum Erstellen des untergeordneten Kontexts? bevor ich mich erinnere, etwas wie [Album createObject] - oder etwas Ähnliches zu verwenden. –

3

Die Art, wie Sie es tun, sollte funktionieren (Aufruf jedes Mal die MOC in jedem Ihrer VC), ist aber nicht "empfohlen".

Was Apple empfiehlt, ist wie bei jeder Core Data App der Stil "pass the baton".

Nested Kontexte machen es wichtig, mehr denn je, dass Sie die nehmen Ansatz „um den Staffelstabes“ von einem Kontext Zugriff (durch einen Kontext vorbei von einem View-Controller zum nächsten), anstatt das Abrufen es direkt aus der Anwendungsdelegat

Siehe hier: http://developer.apple.com/library/ios/#releasenotes/DataManagement/RN-CoreData/_index.html

Was Ihre zweite Frage, RestKit Spar verwalten sollte/Ihre Kerndaten auf Erfolg Ihrer api Anrufe stapeln aktualisieren, wenn alles gut/Setup abgebildet wird.

Von blake der RK Schöpfer:

wenn Sie POST oder ein Core Data Objekt PUT, RK ein permanentes Objekt ID für sie erhält und erstellt dann einen sekundären Objektkontext verwaltet, feuert die Anforderung und bildet die Antwort ab (wenn möglich). Wenn die Antwort und die Zuordnung erfolgreich sind, wird es entweder zurück in den übergeordneten Kontext oder den gesamten Weg zurück in den persistenten Speicher (d. h. in SQLite) basierend auf dem Wert von savesToPersistentStore.

Verwandte Themen