RestKit: какой метод делегата вызывается для postObject?

Какой метод RKObjectLoaderDelegate вызывается после вызова метода - (RKObjectLoader *)postObject:(id<NSObject>)object delegate:(id<RKObjectLoaderDelegate>)delegate?

Я пытаюсь запустить еще немного кода, как только мой POST будет успешным.

ИЗМЕНИТЬ (подробнее):

Ни один из методов, упомянутых @Paul, не вызывается, но мой сервер несколько правильно интерпретирует POST, потому что в БД записывается.

Во время инициализации приложения я делаю следующее:

// Grab the reference to the router from the manager
RKObjectRouter *router = [RKObjectManager sharedManager].router;

// Define a default resource path for all unspecified HTTP verbs
[router routeClass:[EventMessage class] toResourcePath:@"/events_messages/:idPrimaryKey"];
[router routeClass:[EventMessage class] toResourcePath:@"/event_messages" forMethod:RKRequestMethodPOST];

И когда я готов к POST, я делаю это:

RKObjectMapping *objectMapping = [RKObjectMapping mappingForClass:[EventMessage class]];
[objectMapping mapKeyPath:@"user_id" toAttribute:@"userId"];
[objectMapping mapKeyPath:@"event_id" toAttribute:@"eventId"];
[objectMapping mapKeyPath:@"message" toAttribute:@"message"];

[[RKObjectManager sharedManager].mappingProvider registerMapping:objectMapping withRootKeyPath:@"event_message"];

[[RKObjectManager sharedManager] postObject:eventMessage delegate:self];

И это ошибка, которую я получаю в консоли:

Error Domain=JKErrorDomain Code=-1 "Неожиданный токен, требуется '{', '}', '[', ']', ',', ':', 'true', 'false', 'null', ' "СТРОКА" ', 'ЧИСЛО'." UserInfo=0x7b9f510 {JKAtIndexKey=0, JKLineNumberKey=1, NSLocalizedDescription=Неожиданный токен, требуется '{', '}', '[', ']', ',', ':', 'true', 'false', 'null', '"STRING"', 'ЧИСЛО'.}


person ill_always_be_a_warriors    schedule 25.04.2012    source источник


Ответы (3)


После того, как вы правильно настроите свои сопоставления, размещение объектов будет очень простым. Как указал Поль Сезанн, будут использоваться соответствующие обратные вызовы.

Однако для публикации объектов вам также потребуется сопоставление сериализации, которое сообщает платформе, какие параметры следует преобразовать в параметры POST:

Пример сопоставления:

    // Serialisation Mapping
    RKObjectMapping *messageSendMapping = [RKObjectMapping mappingForClass:[NSMutableDictionary class]];

    [messageSendMapping mapAttributes:@"name", @"number", @"text", nil];

    [[RKObjectManager sharedManager].mappingProvider
            setSerializationMapping:messageSendMapping
                           forClass:[Message class]];

Обновление: в целях устранения неполадок вы можете увеличить уровень журнала для RestKit следующим образом:

RKLogConfigureByName("RestKit", RKLogLevelTrace);
RKLogConfigureByName("RestKit/Network", RKLogLevelTrace);
RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace);
RKLogConfigureByName("RestKit/CoreData", RKLogLevelTrace);
person Besi    schedule 25.04.2012
comment
Привет Беси. Я добавил немного кода. Ожидается ли, что если отображение сериализации неверно, ни didLoadObjects, ни didFailWithError не будут вызываться? - person ill_always_be_a_warriors; 26.04.2012
comment
Я ожидаю, что будет вызван didFailWithError. Что вы также можете сделать, так это вести более подробный журнал с помощью RestKit (см. мой обновленный ответ). - person Besi; 26.04.2012
comment
У меня похожая проблема, и журнал не показывает ошибок. Кажется, что он просто запускает запрос, но больше ничего не происходит. Я могу опубликовать запрос, используя общий клиент, и он возвращается, но [RKObjectManager sharedManager] postObject:foo delegate:self] не вызывает ни одну из моих функций делегата. Включение ведения журнала не показывает ошибок. - person drewish; 27.06.2012
comment
Точно так же, если я вызываю [[RKObjectManager sharedManager] postObject:foo usingBlock:^(RKObjectLoader *loader) { NSLog(@"this never fires"); }];, блок не выполняется. - person drewish; 27.06.2012
comment
Ах, так получается, что [RKObjectManager sharedManager] не самоинициируется, вы должны сделать это сами. То же самое касается маршрутизатора RKObjectManager. Почему-то я думал, что они будут построены для меня. Это просто показывает, что если что-то не работает, убедитесь, что вы не отправляете сообщения на ноль. - person drewish; 28.06.2012

Убедитесь, что RKObjectManager был инициализирован:

NSString *url = @"http://example.com";
RKObjectManager* mgr = [RKObjectManager managerWithBaseURLString:url];

Я потратил кучу времени, прежде чем заметил, что sharedManager на самом деле не является синглтоном, вы должны его инициализировать.

После этого вы можете использовать sharedManager и получить ссылку на первый созданный:

[[RKObjectManager sharedManager].mappingProvider setObjectMapping:mapping forResourcePathPattern:@"/RKKeyValueMappingExample"];
person drewish    schedule 28.06.2012
comment
Тем не менее, sharedManager является синглтоном, но вы должны инициализировать его самостоятельно, потому что RestKit должен знать baseURL - person Besi; 28.06.2012
comment
Беси, это действительно не так. Обычно синглтон ограничивает создание, поэтому существует только один экземпляр. Поскольку вы можете создать несколько менеджеров, это другой шаблон. Я полностью понимаю, что вы говорите о необходимости URL-адреса для инициализации. - person drewish; 28.06.2012

person    schedule
comment
Привет, Пол. Я добавил больше информации. Ни один из этих методов не вызывается. - person ill_always_be_a_warriors; 26.04.2012
comment
включите трассировку, как говорит Беси. - person Paul Cezanne; 26.04.2012
comment
Я думаю, что мое сопоставление сериализации было неправильным. Один из двух вышеперечисленных методов теперь вызывается правильно. Спасибо за помощь. - person ill_always_be_a_warriors; 04.07.2012