与 Three20 集成的 RestKit

Posted

技术标签:

【中文标题】与 Three20 集成的 RestKit【英文标题】:RestKit with Three20 Integration 【发布时间】:2011-02-10 15:17:03 【问题描述】:

我正在尝试使用 Restkit 来调用我的 Web 服务器 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 类

@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];    

首先,我想我需要以某种方式告诉解析器视频对象出现在“响应”节点内。 其次,我不确定我是否按照应有的方式进行所有通话。

非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

您可以通过将 RKRequestTTModel 上的 keyPath 属性设置为“responses”来深入了解“responses”元素。

您的响应实际上是 XML 吗?目前 RestKit 不支持 XML 有效负载(它正在重新开始工作的路线图上)。你能得到一个 JSON 有效载荷吗?如果没有,并且您想打一场好仗,您需要做的就是实现 RKParser 协议,该协议可以将 XML 与 Cocoa 对象(字典和数组)相互转换。

【讨论】:

RKRequestTTModel 至少在我的源代码中没有 keyPath 属性。你是说另一个对象吗?是的,我在 xml 中展示了示例,但实际上我得到了 JSON 响应。 不,它没有,但它有一个初始化程序: - (id)initWithResourcePath:(NSString*)resourcePath params:(NSDictionary*)params objectClass:(Class)klass keyPath:(NSString *)keyPath; 或者,您可以添加访问器,只需确保在将模型设置为视图控制器模型之前进行设置。【参考方案2】:

我发现这个问题是为了让 XML 与 RestKit 0.20 一起工作。

在回答上述问题时这是不可能的 - 现在是通过一个附加模块: https://github.com/RestKit/RKXMLReaderSerialization

您可以通过将其添加到您的 Podfile 来使用它:

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

然后注册它以供使用:

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

【讨论】:

以上是关于与 Three20 集成的 RestKit的主要内容,如果未能解决你的问题,请参考以下文章

一个包装 iOS 动画的库,其方式与three20 包装 UI 类的方式相同

Cesium开发工具篇 | 05与第三方库的集成

Three20 和 Facebook Graph API 问题

找不到存档的 Three20/Three20.h 文件

UIViewController解耦---浅析Three20架构

Three20 和未签名的证书