RestKit с интеграцией Three20 - PullRequest
       19

RestKit с интеграцией Three20

5 голосов
/ 10 февраля 2011

Я пытаюсь работать с Restkit для вызова API моего веб-сервера, но все не работает. Мой контроллер просто показывает индикатор активности, и ничего не происходит.

У меня есть вызов API, который предполагает вернуть 50 лучших видео, например: http://example.com/services/getTop50Video

Возврат в формате:

<results>
<mysql_host>72.9.41.97</mysql_host>
<results>        
    <title/>
    <views/>
    <video_id>j2xFxHgENt4</video_id>
    <thumbnail>http://img.youtube.com/vi/j2xFxHgENt4/2.jpg</thumbnail>
    <url/>
</results>
...
</results>

Код участника моего приложения :

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Configure RestKit Object Manager
    RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:@"http://example.com/services"];

    RKObjectMapper* mapper =  objectManager.mapper;
    [mapper registerClass:[YouTubeVideo class] forElementNamed:@"video"];

     // Other non relevant stuff
}

TWYouTubeVideo Class :

@implementation TWYouTubeVideo

@synthesize title = _title;
@synthesize numberOfViews = _numberOfViews;
@synthesize videoID = _videoID;
@synthesize thumbnailURL = _thumbnailURL;


+ (NSDictionary*)elementToPropertyMappings {
    return [NSDictionary dictionaryWithKeysAndObjects:
            @"title", @"title",
            @"views", @"numberOfViews",
            @"video_id", @"videoID",
            @"thumbnail", @"thumbnailURL",
            nil];
}

Код моего контроллера :

-(id) initWithResourcePath:(NSString*) requestedResourcePath
{
    if (self = [super init])
    {
        self.resourcePath = requestedResourcePath;
    }
    return self;
}

- (void)createModel {
    self.model = [[[RKRequestTTModel alloc] initWithResourcePath:self.resourcePath] autorelease];
}


- (void)didLoadModel:(BOOL)firstTime {
    [super didLoadModel:firstTime];

    RKRequestTTModel* model = (RKRequestTTModel*)self.model;
    NSMutableArray* items = [NSMutableArray arrayWithCapacity:[model.objects count]];

        for (YouTubeVideo* video in model.objects) {
            TableSubtitleItem *item = [TableSubtitleItem itemWithText:video.title
                                                                 subtitle:[NSString stringWithFormat:@"%@ views", video.numberOfViews]
                                                                 imageURL:video.thumbnailURL
                                                             defaultImage:[YouTubeVideo defaultThumbnail]
                                                                      URL:nil
                                                             accessoryURL:nil];

            [items addObject:item];
        }


    // Ensure that the datasource's model is still the RKRequestTTModel;
    // Otherwise isOutdated will not work.
    TTListDataSource* dataSource = [TTListDataSource dataSourceWithItems:items];
    dataSource.model = model;
    self.dataSource = dataSource;
}

И нажатие на контроллер :

SecondYouTubeController* viewController = [[SecondYouTubeController alloc] initWithResourcePath:@"/getTop50VideoXML?json=true"];
[self.navigationController pushViewController:viewController animated:YES];
[viewController release];    

Во-первых, я думаю, мне нужно как-то сказать парсеру, что видеообъекты появляются внутри узла "ответа". Во-вторых, я не уверен, что делаю все звонки, как следует.

Я был бы очень признателен за помощь.

Ответы [ 2 ]

2 голосов
/ 10 февраля 2011

Вы можете углубиться в элемент «answers», установив для свойства keyPath в RKRequestTTModel значение «response».

Является ли ваш ответ на самом деле XML?В настоящее время RestKit не поддерживает полезную нагрузку XML (он снова готов к работе).Можете ли вы получить полезную нагрузку JSON?Если нет, и вам хочется сражаться в хорошей борьбе, все, что вам нужно сделать, это реализовать протокол RKParser, который может превращать XML в / из объектов Какао (Словари и массивы).

0 голосов
/ 08 июля 2013

Я нашел этот вопрос, пытаясь заставить XML работать с RestKit 0.20.

На момент ответа выше это было невозможно - теперь через дополнительный модуль: https://github.com/RestKit/RKXMLReaderSerialization

Вы можете использовать его, добавив его в свой подфайл:

pod 'RKXMLReaderSerialization', :git => 'https://github.com/RestKit/RKXMLReaderSerialization.git', :branch => 'master'

И регистрируем его для использования таким образом:

[RKMIMETypeSerialization registerClass:[RKXMLReaderSerialization class] forMIMEType:@"application/xml"];
...