2013-04-02 23 views
5

Tôi đang gặp khó khăn khi tìm tài liệu hoặc ví dụ về việc tạo đối tượng được quản lý mới, đặt giá trị của nó và lưu vào máy chủ bằng Restkit.Làm cách nào để tạo/đăng đối tượng được quản lý mới lên máy chủ bằng Restkit 0.20.0?

Tôi có một bài viết NSManagedObject:

@interface Post : NSManagedObject 

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

@end 

Đây là cài đặt appdelegate tôi:

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

Bây giờ, Trong NewPostViewController của tôi khi tôi nhấp của tôi nút tôi có trong navbar của tôi "Save", những gì cần phải làm gì để lưu bài đăng này lên máy chủ của tôi?

Đây là những gì tôi đã thử, nhưng nó không hoạt động chính xác. Tôi nhập khối thành công và máy chủ của tôi đã POST, nhưng các lĩnh vực là con số không:

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

Bạn có thể đăng nhập đối tượng kết quả ánh xạ không? –

+0

Máy chủ của tôi phản hồi lại với Bài đăng mới được tạo nhưng không phải cho cả tiêu đề và văn bản. Kiểm tra giao diện điều khiển đầu ra của đường ray của tôi nó nhận được yêu cầu POST, nhưng văn bản và tiêu đề là không. – sbonkosky

+0

bạn đã cố gắng truy cập vào chúng chưa? CoreData có thể tải nó một cách lười biếng. –

Trả lời

4

Dường như bạn chưa thêm bất kỳ RKRequestDescriptor cho người quản lý đối tượng của bạn. Nếu không có chúng, người quản lý đối tượng nghèo không thể sử dụng phép thuật khóa/giá trị để sắp xếp từng đối tượng của bạn thành một NSDictionary.

Điều bạn đã thêm, RKResponseDescriptor, mô tả cách thức phản hồi được quản lý. Đó là lý do tại sao bạn nhìn thấy khối thành công được gọi là: RestKit không biết bạn đang cố gắng gửi gì, nhưng nó nhận ra các đối tượng Post trong phản hồi của máy chủ.

Hãy thử thêm dưới đây đang responseDescriptor của bạn:

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

(kiểm tra lại keypath, tôi không biết những gì API của bạn mong muốn, vì vậy tôi đã đi với những gì bạn đã có trong các mô tả phản ứng)

+0

Chỉ là những gì tôi đã mất tích, cảm ơn bạn! Tuy nhiên, tôi không thể sử dụng '[postMapping inverseMapping] ', vì trường id đã được đặt thành 0, vì vậy tôi đã tạo một requestDescriptor mới để lại trường id. Id được tạo trên máy chủ khi đối tượng được đăng. Tôi có cần phải làm bất kỳ dữ liệu cốt lõi nào lưu lại như một phần của điều này không? Phản hồi trả về là bài viết mới được tạo ra, đủ tốt chưa? Nó phù hợp với bài trả lờiDescriptor ... – sbonkosky

+0

Công việc của nó ...! Nhưng có yêu cầu ánh xạ ngược trong yêu cầu nhận được không? – Siten

Các vấn đề liên quan