2012-01-03 2 views
3

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

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

User *currentUser = [User currentUser]; 
    currentUser.email = @"[email protected]"; 
    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\":\"[email protected]\",\"userId\":5,\"lastName\":\"Morris\",\"phone\":\"\",\"timeStamp\":3987987968.0}}"

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

+0

Я не могу импортировать RKSpecResponseLoader в модульное тестирование на iOS. Какую библиотеку мне нужно использовать с моей тестовой целью, чтобы ее можно было скомпилировать? – cipherz

+0

Я закончил копирование и изменение RKSpecResponseLoader прямо в мою тестовую цель, изменив ее и скомпилировав ее оттуда. Таким образом, я смог добавить и изменить возможности загрузчика ответов без нарушения сборки RestKit. – jacobsimeon

ответ

4

Что заставляет вас думать, что новый объект 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-модели на сервер) и у вас есть установка ключевого ресурса правильно (это json {user: {user stuff}} или просто {user stuff}), тогда он должен «просто работать».

+0

Привет, снова lottadot. Вы совершенно правы. Я просто понял это. Объект ** обновляется **, но у меня не было данных ядра, настроенных для сохранения присвоенного сервером атрибута userId. Кажется, что RK/CoreData будет только обновлять свойства объекта, объявленные как часть объектной модели. – jacobsimeon

Смежные вопросы