RestKit - Опубликовать объект и обновить его атрибуты - PullRequest
3 голосов
/ 03 января 2012

У меня есть небольшое приложение, использующее RestKit с сервером, поддерживаемым Sinatra.Когда я размещаю объект пользователя на сервере, сервер успешно сохраняет пользователя и отвечает представлением json только что созданного пользователя.

Вот код для создания пользователя на клиенте:

  User *currentUser = [User currentUser];  
  currentUser.email = @"jacob@mail.com";
  currentUser.firstName = @"Jacob";
  currentUser.lastName = @"Morris";
  currentUser.phone = @"2088956709";
  currentUser.deviceId = @"MY-DEVICE-ID";
  currentUser.password = @"password";
  currentUser.passwordConfirmation = @"password";
  currentUser.timeStamp = [NSNumber numberWithFloat:3987987987.12233]; //totally random

  RKSpecResponseLoader *loader = [RKSpecResponseLoader responseLoader];
  [dataController.rkObjectManager postObject:currentUser mapResponseWith:[User rkObjectMapping] delegate:loader];
  [loader waitForResponse];
  NSLog(@"Current user id is now: %@", currentUser.userId);
  STAssertTrue([loader success], @"response from server should be a success");

Ответ, возвращаемый с сервера, выглядит следующим образом:

"{\"user\":{\"deviceId\":\"MY-DEVICE-ID\",\"email\":\"jacob@mail.com\",\"userId\":5,\"lastName\":\"Morris\",\"phone\":\"\",\"timeStamp\":3987987968.0}}"

Сервер отвечает за назначение userId при успешном создании объекта.Когда ответ вернется, я бы хотел, чтобы объект currentUser был обновлен на стороне клиента.Я думаю, что это должно быть возможно, так как я передаю ссылку на опубликованный объект загрузчику объектов.Как я могу заставить загрузчик объектов обновлять userId после успешного ответа?(Я хотел бы иметь возможность сделать это, не захватывая сам ответ.)

1 Ответ

4 голосов
/ 04 января 2012

Что заставляет вас думать, что новый объект User не обновляется после успешного завершения postObject?

Насколько я понимаю, если при публикации postObject в RKObjectLoader он попытается отобразить ответ обратно на исходный объектбыть POST'd как поведение по умолчанию.Единственный способ заставить его этого не делать, это если вы выставите счет целевому объекту.

Попробуйте что-то вроде этого:

[[RKObjectManager sharedManager] postObject: currentUser delegate:self block:^(RKObjectLoader* loader) { 
            loader.resourcePath = @"/users";
            loader.objectMapping = [[RKObjectManager     sharedManager].mappingProvider objectMappingForKeyPath:@"/users"]; 
}];

Пока вы правильно настроили сопоставленияс сервера в objc-модель и из objc-модели на сервер), и вы правильно настроили KeyPath (это json {user: {user stuff}} или просто {user stuff}), тогда он должен "просто работать".

...