2013-04-02 7 views
5

Mam bardzo ciężko znaleźć dokumentację lub przykłady tworzenia nowego zarządzanego obiektu, ustawiania jego wartości i zapisywania na serwerze przy użyciu narzędzia Restkit.Jak utworzyć/opublikować nowy obiekt zarządzany na serwerze przy użyciu narzędzia Restkit 0.20.0?

mam NSManagedObject postu:

@interface Post : NSManagedObject 

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

@end 

To mój AppDelegate Setup:

// ---- 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]; 

Teraz, w moim NewPostViewController gdy klikam mój przycisk mam w pasku nawigacyjnym "Zapisz", co czy muszę zrobić, aby zapisać ten wpis na moim serwerze?

Oto, co próbowałem, ale nie działa poprawnie. I wprowadzić blok sukces i mój serwer dostał POST, ale pola są zerowe:

- (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

Czy możesz zarejestrować obiekt wyniku mapowania? –

+0

Mój serwer odpowiada z nowo utworzonym wpisem, ale zero zarówno dla tytułu, jak i tekstu. Sprawdzając moją konsolę wyjściową, otrzymuje żądanie POST, ale tekst i tytuł są zerowe. – sbonkosky

+0

Czy próbowałeś uzyskać do nich dostęp? CoreData może ładować go leniwie. –

Odpowiedz

4

Wygląda na to, że nie mają żadnych RKRequestDescriptor do swojego kierownika obiektu. Bez nich słaby menedżer obiektów nie może użyć magii klucz/wartość do serializacji obiektu do NSDictionary.

Rzecz, którą dodałeś, RKResponseDescriptor, opisuje sposób zarządzania odpowiedziami. Właśnie dlatego widzisz blok sukcesu o nazwie: RestKit nie ma pojęcia, co próbujesz wysłać, ale rozpoznaje obiekty Post w odpowiedzi serwera.

Spróbuj dodać ten poniżej kodzie responseDescriptor:

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

(dwukrotnie sprawdzić keypath; nie wiem, co się API spodziewa się, więc poszedłem z tym, co miał w deskryptorze odpowiedzi)

+0

Po prostu tego, czego mi brakowało, dziękuję! Nie mogłem jednak użyć '[odwzorowanie odwrotne mapowania]', ponieważ pole id było ustawione na 0, więc stworzyłem nowy requestDescriptor, który opuścił pole id. Identyfikator jest tworzony na serwerze po opublikowaniu obiektu. Czy muszę wykonywać jakiekolwiek podstawowe zapisywanie danych w ramach tego? Odpowiedź zwrotna jest nowo utworzonym postem, czy to wystarczy? Pasuje do odpowiedzi na odpowiedźDeskryptor ... – sbonkosky

+0

Jego praca ...! Ale czy odwrotne mapowanie jest wymagane w żądaniu otrzymania? – Siten

Powiązane problemy