NSDictionary objectForKey - нужен NSArray с одним элементом вместо просто элемента - PullRequest
0 голосов
/ 15 февраля 2012

Я новичок в объективе-c и мне нужна помощь. В приведенном ниже коде, если xml содержит только один элемент, вызовы objectForKey приведут к созданию одного элемента вместо NSArray с одним элементом. Как мне обновить код, чтобы убедиться, что строка:

[[ApplicationManager sharedInstance] setTags:[[result objectForKey:XML_OPTION_LIST] objectForKey:XML_OPTION]];

всегда вызывает setTags с NSArray (даже если xml содержит ноль или один элемент)?

NSString *XMLResponse = [request responseString];
NSError *parseError = nil;
NSDictionary *xmlDictionary = [XMLReader dictionaryForXMLString:XMLResponse error:&parseError];
NSDictionary *result = [xmlDictionary objectForKey:XML_RESULT];

if ([[[result objectForKey:XML_ERROR_CODE] objectForKey:XML_TEXT] isEqualToString:XML_ERROR_NONE]) {
    [[ApplicationManager sharedInstance] setTags:[[result objectForKey:XML_OPTION_LIST] objectForKey:XML_OPTION]];
    [[ApplicationManager sharedInstance] save];
} 

Элемент xml OPTION_LIST содержит один или несколько элементов OPTION. Когда возникает только один элемент OPTION, возникает ошибка (выходящая за рамки этого кода). Я ценю вашу помощь.

1 Ответ

0 голосов
/ 15 февраля 2012

Ошибка возникает из-за того, что вы пытаетесь отправить сообщение objectForKey: на какой-либо объект, который не является экземпляром NSDictionary.

Вы должны включить тест для его обнаружения и пройти метод setTags: этого элемента непосредственно в соответствии с результатом теста.

if([[[result objectForKey:XML_ERROR_CODE] objectForKey:XML_TEXT] isEqualToString:XML_ERROR_NONE]) {
    if([[result objectForKey:XML_OPTION_LIST] isKindOfClass:[NSDictionary class]]) {
        [[ApplicationManager sharedInstance] setTags:[[result objectForKey:XML_OPTION_LIST] objectForKey:XML_OPTION]];
    }
    else {
        [[ApplicationManager sharedInstance] setTags:[result objectForKey:XML_OPTION_LIST]];
    }
    [[ApplicationManager sharedInstance] save];
}
...