2013-04-02 12 views
5

Ben değerleri var ayarlayarak, dokümantasyon veya yeni yönetilen nesne oluşturma örneklerini bulmak çok zor bir zaman geçiriyor ve Restkit kullanarak sunucuya biriktiriyorum.Restkit 0.20.0 kullanarak yeni yönetilen bir nesneyi sunucuya nasıl oluşturabilirim/yayınlarım?

Bir NSManagedObject Mesaj var:

@interface Post : NSManagedObject 

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

@end 

Bu benim AppDelegate Kur: Ben benim benim gezinme çubuğu var "Kaydet" düğmesini tıkladığında benim NewPostViewController olarak, Şimdi

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

ne Bu gönderiyi sunucuma kaydetmek için ne yapmam gerekiyor?

İşte çalıştığım buydu, ancak doğru çalışmıyor. Ben başarı bloğu girip benim sunucu POST var, ama alanlar nil şunlardır: Eğer nesne yöneticisine herhangi RKRequestDescriptor 's eklememiş gibi

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

Eşleme sonucu nesnesini kaydeder misin? –

+0

Sunucum yeni oluşturulan Gönderi ile yanıt veriyor, ancak hem başlık hem de metin için sıfır. Raylarım çıkış konsolunu kontrol etmek POST isteğini alır, ancak metin ve başlık sıfırdır. – sbonkosky

+0

Onlara erişmeyi denediniz mi? CoreData tembel olarak yükleniyor olabilir. –

cevap

4

görünüyor. Bunlar olmadan, zayıf nesne yöneticisi nesneyi bir NSDictionary haline serileştirmek için anahtar/değer sihrini kullanamaz.

Eğer RKResponseDescriptor eklendi VAR şey, tepkiler yönetilir açıklamaktadır. Bu yüzden denilen başarı bloğunu görüyorsunuz: RestKit ne göndermeye çalıştığınıza dair bir fikriniz yok, ancak sunucu yanıtındaki Post nesnelerini tanıyor. senin responseDescriptor kodunun altında bu ekleme

Dene:

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

(çift ana yol kontrol edin; ben API beklediğini bilmiyorum, o yüzden cevap tanımlayıcısı ne vardı gitti)

+0

Eksik olduğum şey, teşekkür ederim! Ben kullanamadı 'id alan 0 edildiği iddiasıyla [postMapping inverseMapping]' da, bu yüzden dışarı kimliği alanını terk yeni bir requestDescriptor yaptı. Nesne gönderildiğinde kimlik sunucuda oluşturulur. Bunun bir parçası olarak herhangi bir çekirdek veri kaydetmem gerekiyor mu? Dönüş cevabı yeni oluşturulan gönderi, bu yeterince iyi mi? Bu post responseDescriptor ile eşleşiyor ... – sbonkosky

+0

Onun çalışması ...! Ancak, istek isteğinde geriye doğru eşleme gerekli mi? – Siten

İlgili konular