好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

RestKit 入门

RestKit 入门

本篇主要简单介绍了一下restkit中的网络连接,字段映射,与RKTableController。并且在最后给出一个简单的load more的RKTableController的派生子类。

RestKit连接: https://github.com/RestKit/RestKit/

一.网络连接

这里主要用到的是RKClient

初始化

- ( void  )initRKClient {

  //   Initialize with a Base URL  
RKClient* client = [RKClient clientWithBaseURL: @"  http://restkit.org  " ]; ! 
 //   Setup HTTP AUTH 设置http验证  
client.username =  @"  restkit  "  ; 
client.password  =  @"  rocks  " ; ! 
 //   Set an app-wide API key HTTP header 设置全局的http头 
[client setValue: @"  123456  "  forHTTPHeaderField: @"  X-RESTKIT-API-KEY  " ]; ! 
 //   The first initialized RKClient becomes 
  //   the sharedClient instance 检测网络 
 [[RKClient sharedClient] isNetworkAvailable]; 
}  

baseURL 的作用是一个网络请求的域(host),这样就不用频繁的写全整个url,之后的调用只要附上后面的地址就行了,往下看。

- ( void  )sendRequest {
  //   Send an HTTP GET request to '  http://restkit.org/contacts  ' 发送一个get请求,完整的请求路径是“  http://restkit.org/contacts  ” 
[[RKClient sharedClient]  get : @"  /contacts  "   delegate  :self]; 
} 
  //   RKRequestDelegate methods代理方法 
- ( void )request:(RKRequest *)request didLoadResponse:(RKResponse *)response { //   成功 
RKLogInfo( @"  Yay! We Got a response  "  ); 
}
 - ( void )request:(RKRequest*)request didFailLoadWithError:(NSError *)error {  //   失败 
RKLogInfo( @"  Oh no! We encountered an error: %@  "  , [error localizedDescription]);
} 

其中 [RKClient  sharedClient] 得到的你第一个生成的RKClient对象。你当然可以不用 [RKClient  sharedClient] ,而用你自己另外生成的RKClient对象来访问网络,这样你就可以在一个页面同时发起多个请求了。

更多 的发送post请求参考官方文档。

 

二.字段映射

这里主要用到的类是 RKObjectManager 和 RKObjectMapping

用法:比如说你有一个文章列表需要加载,网络发给你的json是

{ "  article_list  "  :[

{  "  title  " : "  article1  " , "  title_id  " : 3 },{ "  title  " : "  article2  " , "  title_id  " : 4 }]}

而你想映射到本地是一个这样的类结构

 Article{

NSString *  aTitle;

  int   tid;

} 

那么首先定义类

 @interface   Article

@property(nonatomic,copy)NSString *  aTitle;

@property(nonatomic)  int   tid;

  @end  

@implement

  @synthesize   aTitle;

  @synthesize   tid;

  @end 

然后生成一个映射规则  RKObjectMapping  对象

RKObjectMapping *contactMapping =  [RKObjectMapping mappingForClass:[Articleclass]];

[contactMapping mapKeyPath:  @"  title  "  toAttribute: @"  aTitle  " ];   [contactMapping mapKeyPath: @"  title_id  "  toAttribute: @"  tid  " ];

然后生成一个RKobjectManager对象,实现数据获取后直接映射成所需类对象

RKObjectManager *manager = [RKObjectManager objectManagerWithBaseURL: @"  http:// restkit.org  "  ];

  //   Ask for & generate JSON json格式数据 
 
manager.acceptMIMEType  =  RKMIMETypeJSON;

manager.serializationMIMEType  =  RKMIMETypeJSON;

[[RKObjectManager sharedManager].mappingProvider setMapping:contactMapping

forKeyPath:  @"  article_list  " ];

其中baseURL和RKClient中的意义相同, [RKObjectManager  sharedManager] 也是你第一个生成的 RKObjectManager 对象。注意最后一句,他为JSON的  @" article_list " 这个 path 绑定了 contactMapping 这种映射关系。如果你的json不是字典结构,而直接就是数组,那么这里设置path为@“”就可以了。

如果你有多个不同的请求,但是数据都是放在“ article_list ”这个path下面,那么就不能都是用 [RKObjectManager  sharedManager] ,而要为其他的请求另外生成 RKObjectManager 对象,并且要注意 retain ,否则可能导致解析失败。

最后通过这个 RKObjectManager 来访问网络资源就可以了。

- ( void  )loadRemoteObjects {

  //   GET /contacts 完整路径是“http:  //   restkit.org/contacts” 
[[RKObjectManager sharedManager] loadObjectsAtResourcePath: @"  /contacts  "   delegate  :self]; 

}

 - ( void )objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray * )objects {

  if  ([objectLoader wasSentToResourcePath: @"  /contacts  "  ]) { 
  //   Introspect the resource path  完成并解析城Article对象保存在objects中 
NSLog( @"  Nice! We loaded the following contacts: %@  "  , objects); 
} 
} 
 - ( void )objectLoader:(RKObjectLoader *)objectLoader didFailWithError:(NSError * )error {
  //   Note that failures here can be at the _application_ level in addition to transport 请求失败 
NSLog( @"  Rats! Failed to load objects: %@  "  , [error localizedDescription]); 
} 

三 .  RKTableController

最终的最终,我们请求了数据之后还是为了显示。RestKit只要短短几行代码就可以把我们的数据显示在tableview中了,这就靠强大的RKTableController

RKTableController  *tableController =  [VRKTableController tableControllerWithTableView:self.tableView forViewController:self];
  //   代理,有开始网络连接,数据加载完成的相关回调 
tableController. delegate  =  self;
  //   一行代码实现下拉刷新 
tableController.pullToRefreshEnabled =  YES;
  //   如果没有额外设置RKTableController的objectManager的话,他默认使用[RKObjectManager sharedManager] 
[self.tableController mapObjectsWithClass:[Summary  class  ] toTableCellsWithMapping:
  [RKTableViewCellMapping cellMappingUsingBlock: ^(RKTableViewCellMapping*  cellMapping) {
        cellMapping.onSelectCellForObjectAtIndexPath  = ^ void (UITableViewCell *cell,  id   object , NSIndexPath * indexPath){
  //  点击事件 
         };
  //   行高 
        cellMapping.rowHeight =  44  ;
  //   设置cell的具体数据 
        cellMapping.onCellWillAppearForObjectAtIndexPath = ^(UITableViewCell* cell,  id   object  ,
                                                            NSIndexPath *  indexPath) {
            Article * article = (Article*) object  ;
            cell.textLabel.text  =  article.title;
        }; }]];
  //   开始加载资源 
    NSString* resourcePath = [NSString stringWithFormat: @"  /content  "  ];
    [self.tableController loadTableFromResourcePath:resourcePath]; 

这些就实现了列表展示了,一切看起来都是那么美好,但是,如何load more呢?我找了半天也没有找到很好的方法,所有就自己派生了一个。附上 下载

 

分类:  iOS

标签:  iOS ,  RestKit ,  RKTableController ,  mapping

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于RestKit 入门的详细内容...

  阅读:39次