RestKit будетMapData: - PullRequest
       4

RestKit будетMapData:

3 голосов
/ 18 июля 2011

Следующий код получает ответ JSON от моего сервера, который состоит из массива элементов, каждый из которых имеет ключ «create_at» и «updated_at». Для всех этих элементов я хочу удалить один символ (двоеточие) в строках, которые установлены для этих двух ключей.

- (void)objectLoader:(RKObjectLoader*)loader willMapData:(inout id *)mappableData {
    // Convert the ISO 8601 date's colon in the time-zone offset to be easily parsable
    // by Objective-C's NSDateFormatter (which works according to RFC 822).
    // Simply remove the colon (:) that divides the hours from the minutes:
    // 2011-07-13T04:58:56-07:00 --> 2011-07-13T04:58:56-0700 (delete the 22nd char)
    NSArray *dateKeys = [NSArray arrayWithObjects:@"created_at", @"updated_at", nil];
    for(NSMutableDictionary *dict in [NSArray arrayWithArray:(NSArray*)*mappableData])
    for(NSString *dateKey in dateKeys) {
        NSString *ISO8601Value = (NSString*)[dict valueForKey:dateKey];
        NSMutableString *RFC822Value = [[NSMutableString alloc] initWithString:ISO8601Value];
        [RFC822Value deleteCharactersInRange:NSMakeRange(22, 1)];
        [dict setValue:RFC822Value forKey:dateKey];
        [RFC822Value release];
    }
}

Однако строка [dict setValue:RFC822Value forKey:dateKey]; поднимает NSUnknownKeyException с сообщением this class is not key value coding-compliant for the key created_at.

Что я здесь не так делаю? Моя главная проблема, возможно, в том, что мне не очень комфортно с этой декларацией ...

1 Ответ

7 голосов
/ 18 июля 2011

Ваша декларация выглядит хорошо для меня.Я предлагаю вам напечатать mappableData с NSLog, чтобы увидеть, как это на самом деле выглядит.

Редактировать: На основании обсуждения в комментариях, mappableData в данном случае фактически является наборомJKDictionary объектов.JKDictionary определено в JSONKit.h (библиотека синтаксического анализа JSON, которую использует RestKit) как подкласс NSDictionary.Следовательно, это не изменяемый словарь, который не реализует [NSMutableDictionary setValue:forKey:].Вот почему вы получаете NSUnknownKeyException во время выполнения.

Одним из способов достижения желаемого может быть что-то подобное (не проверено!):

- (void)objectLoader:(RKObjectLoader*)loader willMapData:(inout id *)mappableData {
    // Convert the ISO 8601 date's colon in the time-zone offset to be easily parsable
    // by Objective-C's NSDateFormatter (which works according to RFC 822).
    // Simply remove the colon (:) that divides the hours from the minutes:
    // 2011-07-13T04:58:56-07:00 --> 2011-07-13T04:58:56-0700 (delete the 22nd char)
    NSArray *dateKeys = [NSArray arrayWithObjects:@"created_at", @"updated_at", nil];
    NSMutableArray *reformattedData = [NSMutableArray arrayWithCapacity:[*mappableData count]];

    for(id dict in [NSArray arrayWithArray:(NSArray*)*mappableData]) {
        NSMutableDictionary* newDict = [dict mutableCopy];
        for(NSString *dateKey in dateKeys) {
            NSMutableString *RFC822Value = [[newDict valueForKey:dateKey] mutableCopy];
            [RFC822Value deleteCharactersInRange:NSMakeRange(22, 1)];
            [newDict setValue:RFC822Value forKey:dateKey];
        }
        [reformattedData addObject:newDict];
    }
    *mappableData = reformattedData;
}
...