У меня есть дескриптор ответа, который отображает ответ с помощью keyPath, такого как @"rootKey.subKey", где rootKey - словарь, а subKey - массив. например

{rootKey:{subKey:[@"object1", @"object2",...,]}}

Но иногда я получаю такой ответ:

{rootKey:@""}

И мое приложение вылетает за исключением того, что NSString не соответствует кодированию ключевого значения для ключа subKey.

Есть идеи, как я могу справиться с такими ситуациями?

0
Shuaib 7 Окт 2014 в 22:18

2 ответа

Лучший ответ

Я сделал это так, чтобы создать дескриптор ответа для ключа верхнего уровня, то есть @ "rootKey" вместо @ "rootKey.subKey", и создать объект верхнего уровня, который имеет только одно свойство отношения "subKeys". Затем я создал динамическое сопоставление, которое на основе представления объектов верхнего уровня либо возвращает сопоставление для подключенных ключей, либо nil:

RKEntityMapping *responseMapping = [RKEntityMapping mappingForEntityForName:@"RootObject" inManagedObjectStore:managedObjectStore];
[responseMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"subKeys" toKeyPath:@"subKeys" withMapping:subKeysMapping]];

RKDynamicMapping* dynamicMapping = [RKDynamicMapping new];
[dynamicMapping setObjectMappingForRepresentationBlock:^RKObjectMapping *(id representation) {
    if ([representation isKindOfClass:[NSDictionary class]]) {
        return responseMapping;
    }
    return nil;
}];

return dynamicMapping;

Это приводит к появлению ненужного объекта верхнего уровня (RootObject), но корректно обрабатывает ответ, когда вместо объекта «ключ-значение» я получаю строку.

0
Shuaib 9 Окт 2014 в 13:37

Лучший вариант, исправить JSON.

Альтернативный вариант: используйте динамическое сопоставление, чтобы проверить, что было получено, и создать сопоставление. на лету, чтобы справиться с этим.

0
Wain 7 Окт 2014 в 22:22
Я на самом деле пробовал это, но похоже, что сбой все еще происходит, даже если в таком случае я возвращаю сопоставление ответа «nil» для использования, когда «подключ» не нажат, то есть корневой объект является строкой.
 – 
Shuaib
7 Окт 2014 в 22:36
Итак, это весь JSON, и вам нужен только один дополнительный ключ? Исправьте ответ (в этом случае должен возвращаться код состояния http, указывающий на отсутствие контента).
 – 
Wain
7 Окт 2014 в 22:40
Любые намеки на решение, кроме исправления ответа API? Если ничего не получится, я могу пойти дальше и создать сложное сопоставление на основе отношений, чтобы иметь возможность обнаруживать, когда ожидаемого объекта нет.
 – 
Shuaib
7 Окт 2014 в 22:42
Вы можете посмотреть на создание сопоставления, которое создает объект ошибки, когда динамическое сопоставление не находит реального содержимого, а затем обрабатывает объект ошибки в обратном вызове успеха.
 – 
Wain
8 Окт 2014 в 01:02