5

新しい管理対象オブジェクトの作成、値の設定、Restkit を使用したサーバーへの保存のドキュメントや例を見つけるのに非常に苦労しています。

私は NSManagedObject 投稿を持っています:

@interface Post : NSManagedObject

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

@end

これは私の 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];

さて、私の NewPostViewController で、ナビゲーションバーにある「保存」ボタンをクリックすると、この投稿をサーバーに保存するにはどうすればよいですか?

これが私が試したものですが、正しく機能していません。成功ブロックに入り、サーバーが POST を取得しましたが、フィールドは nil です:

- (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);
    }];
}
4

1 に答える 1

4

オブジェクト マネージャーに RKRequestDescriptor を追加していないようです。それらがなければ、貧弱なオブジェクト マネージャーは、キー/値の魔法を使用してオブジェクトを NSDictionary にシリアル化することができません。

追加したもの、RKResponseDescriptor は、応答がどのように管理されるかを記述します。そのため、RestKit は何を送信しようとしているのかわかりませんが、サーバーの応答で Post オブジェクトを認識します。

これを responseDescriptor コードの下に追加してみてください。

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

(キーパスを再確認してください。APIが何を期待しているのかわかりません。そのため、応答記述子にあるものを使用しました)

于 2013-04-03T22:07:05.893 に答える