Отображение вложенных объектов с помощью RestKit в Xcode с использованием Objective-C - PullRequest
2 голосов
/ 10 декабря 2011

С помощью mja мне удалось успешно настроить простое сопоставление объектов с помощью RestKit и Objective-C. Пожалуйста, смотрите мой предыдущий вопрос здесь .

Мой следующий шаг - попытаться разобраться с вложенным JSON таким же образом.

Мой JSON выглядит следующим образом: внешняя часть - это кандидатская фраза с несколькими вложенными голосами:

{ "Id":33696,
"Phrase": "phrase",
"BadCount":0,
"Votes":[{"Id":447,"OriginalId":33696,"Votes":2,"Translation":"translation 1"},
{"Id":746,"OriginalId":33696,"Votes":1,"Translation":"translation 2"},
{"Id":747,"OriginalId":33696,"Votes":1,"Translation":"translation 3"}
]}

Я создал связь в своем AppDelegate следующим образом:

[candidatePhraseMapping mapKeyPath:@"votes" toRelationship:@"vote" withMapping:voteMapping];

Когда я вызываю команду make request в моем контроллере, я в состоянии справиться с остальной частью CandidatePhrase, но я не совсем уверен, как отобразить вложенные объекты голосования в массив, чтобы я мог использовать их в TableView

(псевдокод что-то вроде этого ...)

// Store the votes in an array
_votes = [[NSArray alloc] initWithObjects:myCandidatePhrase.votes, nil];

Вот мой объект CandidatePhrase

@interface CandidatePhrase : NSObject

@property (nonatomic, retain) NSNumber* ident;
@property (nonatomic, retain) NSNumber* badcount;
@property (nonatomic, retain) NSString* phrase;
@property (nonatomic, retain) NSArray* votes;

@end

и мой объект голосования

@interface Vote : NSObject

@property (nonatomic, retain) NSNumber* ident;
@property (nonatomic, retain) NSNumber* originalId;
@property (nonatomic, retain) NSNumber* votecount;
@property (nonatomic, retain) NSString* translation;

+ (id)voteWithTranslationId:(NSNumber *)ident translation:(NSString *)translation;

@end

Любая помощь будет принята с благодарностью.

EDIT

Ниже приведен код моей карты

// Votes Mapping

RKObjectMapping* voteMapping = [RKObjectMapping mappingForClass:[Vote class]];
[voteMapping mapKeyPath:@"Id" toAttribute:@"ident"];
[voteMapping mapKeyPath:@"OriginalId" toAttribute:@"originalId"];
[voteMapping mapKeyPath:@"Votes" toAttribute:@"votecount"];
[voteMapping mapKeyPath:@"Translation" toAttribute:@"translation"];

[[manager mappingProvider] addObjectMapping:voteMapping];

// Candidate Phrase Mapping
RKObjectMapping *candidatePhraseMapping = [RKObjectMapping mappingForClass:[CandidatePhrase class]];

[candidatePhraseMapping mapKeyPath:@"Id" toAttribute:@"ident"];
[candidatePhraseMapping mapKeyPath:@"Phrase" toAttribute:@"phrase"];
[candidatePhraseMapping mapKeyPath:@"BadCount" toAttribute:@"badcount"];

[candidatePhraseMapping mapKeyPath:@"Votes" toRelationship:@"votes" withMapping:voteMapping];

[[manager mappingProvider] addObjectMapping:candidatePhraseMapping];

Для ясности, вот как я пытаюсь получить доступ к пунктам голосования на контроллере

- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObject:(id)object 
{ 
    CandidatePhrase *myCandidatePhrase = (CandidatePhrase*)object;
    self.candidateText.text = myCandidatePhrase.phrase; <-- works fine

    _votes = [[NSArray alloc] initWithObjects:myCandidatePhrase.votes, nil];
    for (id o2 in _votes) { 
        //Vote *vote = o2; 
        NSLog(@"Item name: %@", o2); <-- sees object but crashes
    }

    NSLog(@"Votes: %@", myCandidatePhrase.votes); 
    _votes = [[NSArray alloc] initWithObjects:myCandidatePhrase.votes, nil];
     [_votesTableView reloadData];
 } 

и мой стол связывается с

Vote *vote = [_votes objectAtIndex:indexPath.row];
cell.textLabel.text = vote.translation;

1 Ответ

3 голосов
/ 10 декабря 2011

Вам не нужно вручную управлять вложенным NSArray.Я полагаю, что проблема может быть просто опечаткой, поскольку вы сопоставляете keyPath «голоса», но ваш json содержит «Голоса» с большой буквы «V».

[candidatePhraseMapping mapKeyPath:@"Votes" toRelationship:@"votes" withMapping:voteMapping];

Если это не поможет, не стесняйтесьоставьте комментарий и обновите свой вопрос с помощью voteMapping.

Кроме того, содержимое didLoadObject может быть упрощено:

//in .h file
@property (nonatomic, retain) NSArray* votes;

// in implementation
@synthesize votes;

...
- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObject:(id)object 
{ 
    CandidatePhrase *myCandidatePhrase = (CandidatePhrase*)object;
    self.candidateText.text = myCandidatePhrase.phrase;
    self.votes = myCandidatePhrase.votes;
}
...