2013-04-02 10 views
5

Ho difficoltà a trovare documentazione o esempi di creazione di un nuovo oggetto gestito, impostazione dei valori e salvataggio nel server tramite Restkit.Come posso creare/pubblicare un nuovo oggetto gestito sul server usando il Restkit 0.20.0?

ho un NSManagedObject messaggio:

@interface Post : NSManagedObject 

@property (nonatomic, retain) NSNumber * postID; 
@property (nonatomic, retain) NSString * title; 
@property (nonatomic, retain) NSString * text; 

@end 

Questo è il mio Setup AppDelegate:

// ---- BEGIN RestKit setup ----- 
RKLogConfigureByName("RestKit/Network", RKLogLevelTrace); 

NSError *error = nil; 
NSURL *modelURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"My_App" ofType:@"momd"]]; 
// NOTE: Due to an iOS 5 bug, the managed object model returned is immutable. 
NSManagedObjectModel *managedObjectModel = [[[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL] mutableCopy]; 
RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel]; 

// Enable Activity Indicator Spinner 
[AFNetworkActivityIndicatorManager sharedManager].enabled = YES; 

// Initialize the Core Data stack 
[managedObjectStore createPersistentStoreCoordinator]; 

NSPersistentStore __unused *persistentStore = [managedObjectStore addInMemoryPersistentStore:&error]; 
NSAssert(persistentStore, @"Failed to add persistent store: %@", error); 

[managedObjectStore createManagedObjectContexts]; 

// Configure a managed object cache to ensure we do not create duplicate objects 
managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:managedObjectStore.persistentStoreManagedObjectContext]; 

// Set the default store shared instance 
[RKManagedObjectStore setDefaultStore:managedObjectStore]; 

// Configure the object manager 
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://localhost:3000/api/v1"]]; 
objectManager.managedObjectStore = managedObjectStore; 
NSString *auth_token = [[LUKeychainAccess standardKeychainAccess] stringForKey:@"auth_token"]; // Getting the Auth_Token from keychain 
[objectManager.HTTPClient setAuthorizationHeaderWithToken:auth_token]; 

[RKObjectManager setSharedManager:objectManager]; 

// Setup Post entity mappping 
RKEntityMapping *postMapping = [RKEntityMapping mappingForEntityForName:@"Post" inManagedObjectStore:managedObjectStore]; 
[postMapping addAttributeMappingsFromDictionary:@{ 
@"title":    @"title", 
@"text":  @"text", 
@"id":   @"postID"}]; 

RKResponseDescriptor *postResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:postMapping pathPattern:nil keyPath:@"post" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
[objectManager addResponseDescriptor:postResponseDescriptor]; 

Ora, Nel mio NewPostViewController quando clicco il mio tasto che ho nella mia barra di navigazione "Salva", cosa devo fare per salvare questo post sul mio server?

Ecco cosa ho provato, ma non funziona correttamente. Entro il blocco successo e il mio server ottenuto il posto, ma i campi sono pari a zero:

- (void)savePost { 
    RKManagedObjectStore *objectStore = [[RKObjectManager sharedManager] managedObjectStore]; 
    Post *post = [NSEntityDescription insertNewObjectForEntityForName:@"Post" inManagedObjectContext:objectStore.mainQueueManagedObjectContext]; 
    [post setTitle:@"The Title"]; 
    [post setText:@"The Text"]; 

    [[RKObjectManager sharedManager] postObject:post path:@"posts" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
     NSLog(@"Success saving post"); 
    } failure:^(RKObjectRequestOperation *operation, NSError *error) { 
     NSLog(@"Failure saving post: %@", error.localizedDescription); 
    }]; 
} 
+0

Puoi registrare l'oggetto risultato della mappatura? –

+0

Il mio server risponde con il post appena creato, ma nulla per titolo e testo. Controllando la console di output delle mie binari riceve la richiesta POST, ma il testo e il titolo sono nulli. – sbonkosky

+0

hai provato ad accedervi? CoreData potrebbe caricarlo pigramente. –

risposta

4

Sembra che tu non hai aggiunto RKRequestDescriptor del al vostro gestore oggetti. Senza di loro, il gestore degli oggetti non è in grado di utilizzare la magia chiave/valore per serializzare l'oggetto in un NSDictionary.

La cosa che hai aggiunto, RKResponseDescriptor, descrive come vengono gestite le risposte. Ecco perché vedi il blocco di successo chiamato: RestKit non ha idea di cosa stai cercando di inviare, ma riconosce gli oggetti Post nella risposta del server.

Prova ad aggiungere questo sotto il codice responseDescriptor:

RKRequestDescriptor * requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[postMapping inverseMapping] objectClass:[Post class] rootKeyPath:@"post"]; 
[objectManager addRequestDescriptor:requestDescriptor]; 

(doppio controllare il percorso chiave, io non so che cosa il vostro API si aspetta, così sono andato con quello che avevi nel descrittore di risposta)

+0

Proprio quello che mi mancava, grazie! Non potevo usare '[postMapping inverseMapping]', perché il campo id era impostato su 0, quindi ho creato un nuovo requestDescriptor che ha lasciato fuori il campo id. L'ID viene creato sul server dopo che l'oggetto è stato pubblicato. Devo fare qualche salvataggio del core come parte di questo? La risposta di risposta è il post appena creato, è abbastanza buono? Corrisponde al post responseDescriptor ... – sbonkosky

+0

Il suo lavoro ...! Ma la mappatura inversa è richiesta per ottenere una richiesta? – Siten

Problemi correlati