优秀开源代码解读:RESTKit的使用教程

这篇教程由一个独立的iOS开发者及4 Arrows Media的创始人 Scott McAlister写的。

 

网上有很多可用于连接和获取有趣、有用数据的web服务器。例如,Twitter有一个web服务,您可以查看列表和发推,Foursquare有一个web服务,您可以建立连接,并让服务器允许您检索你当前位置附近的餐馆的列表。如果你想要使用这些api,您可以使用NSURLRequest或封装好的框架像ASIHTTPRequest或AFNetworking立即连接到他们的服务器。正如教程 other tutorials中提到的那样。

 

然而,有一个更简单的方法实现这些api——使用RESTKit !RESTKit是一个易于使用的流行框架,使您不必编写很多无聊的代码,通常情况下你要当处理web服务api,比如解析JSON或映射响应对象等。在这教程中,我们会去试试做一简单的应用程序,使用FourSquare API列出附近的咖啡店——因为我喜欢咖啡!

 

本教程是为任何水平的iOS开发者,从初学者到高级。请鼓起勇气读下去。

 

开始

首先,我们将在Xcode创建一个 Master-View应用程序。如果您已经熟悉如何做到这一点,它是如何工作的,可以快速移动到下一个部分——但是我不得不为了那些初学者包括更多的细节。

 

启动Xcode并选择Master-Detail程序模板创建一个新项目。输入CoffeeShop做为项目的名字,device family选择为iPhone,勾上Use Storyboards and Use Automatic Reference Counting复选框(其他复选框不必选)

优秀开源代码解读:RESTKit的使用教程_第1张图片

单击Next,并选择一个位置来保存你的项目。

 

选择Master-Disciple的,呃,等等…Master-Detail 是一个功能完备的应用程序模板,所以单击Run来构建和运行。您应该看到一个空白的屏幕,导航条上面有编辑和添加(+)按钮。单击“+”按钮以添加一些表条目到主屏幕。点击其中的一项将显示详细信息屏幕:

优秀开源代码解读:RESTKit的使用教程_第2张图片

你可以看到这种格式非常适合数据列表,包含不同级别的信息。打开 MasterViewController.h:

  
  
  
  
  1. #import <UIKit/UIKit.h> 
  2.   
  3. @interface MasterViewController : UITableViewController 
  4.   
  5. @end 

MasterViewController继承自UITableViewController类,管理UITableView并遵循2个协议:UITableViewDelegate 和 UITableViewDataSource.

 

UITableViewDataSource是用来控制UITableView显示的数据,UITableViewDelegate是用来操作UITableView的事件(如数据选择;置顶信息;删除和重新排序数据)

 

注意这些在MasterViewController.m里面的关键方法:

  
  
  
  
  1.   
  2. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView  
  3. {  
  4.     return 1;  
  5.   
  6. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  
  7.     return _objects.count;  
  8.   
  9. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath  
  10. {  
  11.     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 
  12.   
  13.     NSDate *object = [_objects objectAtIndex:indexPath.row]; cell.textLabel.text = [object description]; 
  14.     return cell;  
  15.   
  16. - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender  
  17. {  
  18.     if ([[segue identifier] isEqualToString:@"showDetail"]) {  
  19.         NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];  
  20.         NSDate *object = [_objects objectAtIndex:indexPath.row];  
  21.         [[segue destinationViewController] setDetailItem:object];  
  22.     }  
  23.   

前两个方法,numberOfSectionsInTableView:和tableView:numberOfRowsInSection:从他们的命名可以看出来,这2个方法是告诉有表有多少分段,每个分段有多少行。

 

在tableView:cellForRowAtIndexPath:方法里你可以指定每个cell数据的显示。

 

prepareForSegue:seder:方法预备在主视图(Master view)显示详情视图(Detail view)的内容。 进而用来控制视图之间的切换 。这是storyboard的一个特性,更多关于细节在Beginning Storyboards in iOS 5 里可以看到。

 

对于本教程,您将只使用主视图控制器来显示一个列表附近的咖啡店。为简单起见,详细信息视图控制器将不被使用。所以去除如下内容:

1.MasterViewController.m类里的prepareForSegue:sender: 方法

2.在MasterViewController.m顶部导入 #import for DetailViewController.h

3.DetailViewController.h 和 DetailViewController.m文件

4.删除MainStoryboard 里面的Detail View Controller – Detail,你可以在这里找到:

优秀开源代码解读:RESTKit的使用教程_第3张图片
 
RESTing Easy

现在用到有趣的东西——RESTKit !RESTKit 主页RestKit.org (RESTKit的主页)描述如下:

 

“RestKit是一个基于objective – c的iOS框架,其目的是为了使RESTful web服务更简单、快速和有趣。它基于强大的对象映射系统并且使用了一个干净、简单的HTTP请求/响应API,减少完成任务所需的代码量。

 

RestKit有三个主要组件:

1.Network – 在NSURLConnection的基础上提供了request/response 抽象方法

2.Object Mapping – 提供了一个简单的API使本地对象响应远程JSON / XML。

3.Core Data – 在对象映射(Object Map)里支持扩展。用来扩展远程资源映射到本地的对象。

 

简而言之,你不必编写大量的代码!

 

最困难的事是安装RestKit。当然这也不难,只是有很多的步骤而已。

 

首先你要做的就是安装这个RestKit。我推荐使用Git来管理你的RestKit安装。

 

打开终端,输入以下命令:

  
  
  
  
  1. $ cd /path/to/MyApplication # initialize git if needed  
  2. $ git init  
  3. $ git submodule add git://github.com/RestKit/RestKit.git RestKit 
优秀开源代码解读:RESTKit的使用教程_第4张图片
 
接下来,把RestKit添加到您的项目 。在一个Finder窗口,打开RestKit文件夹选择你的项目文件夹。在Xcode里把RestKit.xcodeproj拖到项目导航器里 。
优秀开源代码解读:RESTKit的使用教程_第5张图片
 
现在你已经告诉您的项目RestKit是存在的,是时候开始最关键的步骤:配置RestKit,这样你就能正确的使用它。2个.xcodeproj都要配置设置,添加下面这些框架来构建配置。
 

1.点击顶部的项目在项目导航器面板中,选择的项目的target。

 

2.单击Build Settings 在搜索框搜索Other Linker Flags。点击Other Linker Flags,在右边值里添加”-ObjC”。

优秀开源代码解读:RESTKit的使用教程_第6张图片

3.配置完之后,在搜索框里输入 Header Search Path 点击右边值里添加“$(BUILT_PRODUCTS_DIR)/../../Headers”。

优秀开源代码解读:RESTKit的使用教程_第7张图片

4.现在点击Build Phases,在Target Dependencies 点击下拉三角形。点击添加按钮,选择REstKit。

 

5.点击连接器,然后在这里选择(+)按钮添加libRestKit.a 静态链接库。

 

6.你还要添加一些苹果自带的框架,如下:(点击cmd可以多选)

CFNetwork.framework

CoreData.framework

libxml2.dylib

MobileCoreServices.framework

QuartzCore.framework

Security.framework

SystemConfiguration.framework

 

7.还点击上次那个‘+’

设置的最后一步, 验证您的RestKit安装和配置。打开AppDelegate.m,并添加以下:

  
  
  
  
  1.   
  2. #import <RestKit/RestKit.h> 

单击运行。如果程序无错误, 那么RestKit就设置正确了。

优秀开源代码解读:RESTKit的使用教程_第8张图片

连接 Foursquare

现在你可以使用RestKit工作,你可以使用RestKit连接Foursquare的web服务器,为你的app获得“地点数据(venue data-让服务器知道你所在地点-译者注)”。

 

你将使用Foursquare的 Search Venues API 来搜索你所在地点附近的咖啡店。

 

别急着立刻阅读整个文档,我们只需要使用一个基本的查询而已(单击下面的连接来试一试):https://api.Foursquare.com/v2/venues/search?ll=37.33,-122.03&categoryId=4bf58dd8d48988d1e0931735,它将返回苹果总部(Apple Headquarters) 附近的咖啡店场所的位置的JSON格式的数据(纬度:37.33 和 经度:-122.03)。

 

Foursquare标识场所的分类是“Coffee Shop”,“categoryId=4bf58dd8d48988d1e0931735.”

 

对于普通查询的典型的JSON响应,和下面的代码相似:

  
  
  
  
  1.   
  2.   
  3.     "meta": { 
  4.         "code": 200 
  5.     },  
  6.     "notifications": [ 
  7.         { 
  8.             "item": { 
  9.                 "unreadCount": 0 
  10.             },  
  11.             "type""notificationTray" 
  12.         } 
  13.     ],  
  14.     "response": { 
  15.         "venues": [ 
  16.             { 
  17.                 "beenHere": { 
  18.                     "count": 0 
  19.                 },  
  20.                 "categories": [ 
  21.                     { 
  22.                         "icon": { 
  23.                             "name"".png",  
  24.                             "prefix""https://Foursquare.com/img/categories/food/coffeeshop_",  
  25.                             "sizes": [ 
  26.                                 32,  
  27.                                 44,  
  28.                                 64,  
  29.                                 88,  
  30.                                 256 
  31.                             ] 
  32.                         },  
  33.                         "id""4bf58dd8d48988d1e0931735",  
  34.                         "name""Coffee Shop",  
  35.                         "pluralName""Coffee Shops",  
  36.                         "primary"true,  
  37.                         "shortName""Coffee Shop" 
  38.                     } 
  39.                 ],  
  40.                 "contact": { 
  41.                     "formattedPhone""(650) 967-4473",  
  42.                     "phone""6509674473",  
  43.                     "twitter""redrockcoffee" 
  44.                 },  
  45.                 "hereNow": { 
  46.                     "count": 1,  
  47.                     "groups": [ 
  48.                         { 
  49.                             "count": 1,  
  50.                             "items": [],  
  51.                             "name""Other people here",  
  52.                             "type""others" 
  53.                         } 
  54.                     ] 
  55.                 },  
  56.                 "id""450af4f4f964a5204c391fe3",  
  57.                 "location": { 
  58.                     "address""201 Castro St.",  
  59.                     "city""Mountain View",  
  60.                     "country""United States",  
  61.                     "crossStreet""at Villa St.",  
  62.                     "distance": 8315,  
  63.                     "lat": 37.393803003654625,  
  64.                     "lng": -122.07888155105633,  
  65.                     "postalCode""94041",  
  66.                     "state""CA" 
  67.                 },  
  68.                 "menu": { 
  69.                     "mobileUrl""https://Foursquare.com/v/450af4f4f964a5204c391fe3/device_menu",  
  70.                     "type""foodAndBeverage",  
  71.                     "url""https://Foursquare.com/v/red-rock-coffee/450af4f4f964a5204c391fe3/menu" 
  72.                 },  
  73.                 "name""Red Rock Coffee",  
  74.                 "specials": { 
  75.                     "count": 0,  
  76.                     "items": [] 
  77.                 },  
  78.                 "stats": { 
  79.                     "checkinsCount": 10817,  
  80.                     "tipCount": 91,  
  81.                     "usersCount": 3281 
  82.                 },  
  83.                 "url""http://redrockcoffee.org/",  
  84.                 "verified"true 
  85.             }  
  86.         ] 
  87.     } 

 Foursquare 提供免费的web服务访问,只要你在“OAuth Consumer Registration”页面注册你的App。所以在继续之前,确保你完成了注册。

优秀开源代码解读:RESTKit的使用教程_第9张图片

 

 

应用程序的Web站点和回调URL可以是您的网站上虚拟页面,因为你的应用程序将是一个移动连接和不依赖于服务器的代码。点击Foursquare’s User Authentication连接获取更多信息。

 

当你创建你的Foursquare应用程序注册时,你会得到一个客户机ID和一个客户的密码,你可以调用Foursquare API。

优秀开源代码解读:RESTKit的使用教程_第10张图片

你需要将这些添加打你的源代码中,这样的话当调用Foursquare API时,RestKit可以验证你的应用程序。将下面的代码添

 

在MasterViewController.m 中的#import下:

  
  
  
  
  1. #define kCLIENTID "Your Foursquare Client ID" 
  2. #define kCLIENTSECRET "Your Foursquare Client Secret" 

记住你必须用从Foursquare中收到的真实的Client ID和密码取代虚拟值。

 

是时候写代码了

你拥有足够的代码片段可以完成你的应用程序,所以您需要做的就是添加代码!

 

你将使用到RestKit的两个组件:Network和Object Mapping。Network:为Foursquare的API定义基本的URL, “https://api.Foursquare.com/v2?″并发送接受你的信息。Object Mapping,你创建一个数据模型,将映射返回的JSON数值。

 

上面举出了2个创景的数据。这样开始创为基于JSON结构的场所数据建立数据模型类。

 

1.选择 File->New->File(原来是右击Project Navigator->New Fil,或者command-N)

优秀开源代码解读:RESTKit的使用教程_第11张图片

2.选择iOS\Cocoa Touch\Objective-C类型,并点击Next。

优秀开源代码解读:RESTKit的使用教程_第12张图片

3.输入类名例如”Venue”,选择继承于NSObject,并点击Next。

优秀开源代码解读:RESTKit的使用教程_第13张图片

4.选择文件的保存位置,并点击创建。

现在你所添加的JSON数据只有“场所的名字venue name”。所以在Venue.h添加name属性:

  
  
  
  
  1. @interface Venue : NSObject 
  2.   
  3. @property (strong, nonatomic) NSString *name; 
  4.   
  5. @end 

Venue.m中的synthesize 属性:

  
  
  
  
  1. @implementation Venue 
  2.   
  3. @synthesize name; 
  4.   
  5. @end 

当需要的时候,你需要继续添加。

 

接下来,为了RestKit使用修改 MasterViewController.m添加下面的头文件:

  
  
  
  
  1. #import <RestKit/RestKit.h> 
  2. #import "Venue.h" 

并修改ViewDidLoad方法:

  
  
  
  
  1. - (void)viewDidLoad 
  2.     [super viewDidLoad]; 
  3.   
  4.     RKURL *baseURL = [RKURL URLWithBaseURLString:@"https://api.Foursquare.com/v2"]; 
  5.     RKObjectManager *objectManager = [RKObjectManager objectManagerWithBaseURL:baseURL]; 
  6.     objectManager.client.baseURL = baseURL; 
  7.      
  8.     RKObjectMapping *venueMapping = [RKObjectMapping mappingForClass:[Venue class]]; 
  9.     [venueMapping mapKeyPathsToAttributes:@"name", @"name", nil]; 
  10.     [objectManager.mappingProvider setMapping:venueMapping forKeyPath:@"response.venues"]; 
  11.      
  12.     [self sendRequest]; 

这里你定义了调用 Foursquare API基本的URL。所有发送的请求将会添加这个基本的URL。如果你需要再两个不同的服务器和环境 (development/staging/production)之间转换的时候,这样作很好。使用基本的URL,你创建一个RKObjectManager对象,RKObjectManager是通过HTTP与RESTful服务的交互的主要接口。

 

RKObjectMapping类是用来映射JSON数据和你的数据的模型(model)类。mapKeyPathsToAttributes将JSON字段映射到您的

 

数据模型的属性。例如,它将JSON中的“id”数据 映射到Venue类中的venueID属性。

 

接下来,创建一个请求信息检索你的表数据,仍然在MasterViewController.m中,添加新的方法sendRequest:

  
  
  
  
  1. - (void)sendRequest 
  2.     NSString *latLon = @"37.33,-122.03"
  3.     NSString *clientID = [NSString stringWithUTF8String:kCLIENTID]; 
  4.     NSString *clientSecret = [NSString stringWithUTF8String:kCLIENTSECRET]; 
  5.      
  6.     NSDictionary *queryParams; 
  7.     queryParams = [NSDictionary dictionaryWithObjectsAndKeys:latLon, @"ll", clientID, @"client_id", clientSecret, @"client_secret", @"coffee", @"query", @"20120602", @"v", nil]; 
  8.     RKObjectManager *objectManager = [RKObjectManager sharedManager]; 
  9.          
  10.     RKURL *URL = [RKURL URLWithBaseURL:[objectManager baseURL] resourcePath:@"/venues/search" queryParameters:queryParams]; 
  11.     [objectManager loadObjectsAtResourcePath:[NSString stringWithFormat:@"%@?%@", [URL resourcePath], [URL query]] delegate:self];     

 RestKit将会通过delegate methods返回响应。为了接受这样响应,你需要实现RKObjectLoaderDelegate协议。

 

这样的话,在MasterViewController.h中声明:

  
  
  
  
  1. @interface MasterViewController : UITableViewController <RKObjectLoaderDelegate> 

然后在MasterViewController.m文件中,添加RKObjectLoaderDelegate的方法:

  
  
  
  
  1. - (void)objectLoader:(RKObjectLoader *)objectLoader didFailWithError:(NSError *)error 
  2.     NSLog(@"Error: %@", [error localizedDescription]); 
  3.   
  4. - (void)request:(RKRequest*)request didLoadResponse:(RKResponse*)response { 
  5.     NSLog(@"response code: %d", [response statusCode]); 
  6.   
  7. - (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects 
  8.     NSLog(@"objects[%d]", [objects count]); 
  9.     data = objects; 
  10.      
  11.     [self.tableView reloadData]; 

唯一一个必须实现的方法是objectLoader:didFailWithError,但是你也需要实现objectLoader:didLoadObjects检索你的请求数据。他返回基于在viewDidLoad注册的对象映射Venue对象数组。

 

如果你现在试图编译, 你将得到一个报错,因为在objectLoader:didLoadObjects的data没有定义。

 

在MasterViewController.m中的修改如下:

  
  
  
  
  1. @interface MasterViewController () { 
  2.     NSMutableArray *_objects; 
  3. @end 
  4.   
  5. @implementation MasterViewController 

 to:

  
  
  
  
  1. @interface MasterViewController () 
  2.   
  3. @property (strong, nonatomic) NSArray *data; 
  4.   
  5. @end 
  6.   
  7. @implementation MasterViewController 
  8. @synthesize data; 

并修改:

  
  
  
  
  1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
  2.     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 
  3.   
  4.     NSDate *object = [_objects objectAtIndex:indexPath.row]; 
  5.     cell.textLabel.text = [object description]; 
  6.     return cell; 
 

为:

  
  
  
  
  1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
  2.     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 
  3.   
  4.     Venue *venue = [data objectAtIndex:indexPath.row];     
  5.     cell.textLabel.text = [venue name]; 
  6.     return cell; 

同时,在 MasterViewController.m, 将 tableView:numberOfRowsInSection:中的返回语句改为:

  
  
  
  
  1. return data.count; 

最后,确保在MasterViewController.m删除了tableView:commitEditingStyle和insertNewObject方法,因为数据不能再改变(另外,Xcode扔几个编译错误,如果您不删除/改正这些方法)。

 

点击运行。你将看到和下图相似的情况:

优秀开源代码解读:RESTKit的使用教程_第14张图片

你会注意到这个列表上的一些地方实际上不是咖啡馆,例如Kaiser Permanente和 Nokia。因为Foursquare数据也有坑爹的时候嘛。:P

 

TableViews保留许多 TableViewCells的集合。但由于性能的原因,它只会为可见的单元格创建足够的TableViewCell。而不是删除和创建更多的表单元格,所以它可以循环利用那些滚动到屏幕外的表单元格。

 

在tableView:cellForRowAtIndexPath方法中,[tableView dequeueReusableCellWithIdentifier:@"Cell"]将会循环使用那些没有使用的单元格(这些表单元格的identifier必须和“Cell”吻合)。在MainStoryboard.storyboard的Table View Cell window中设置identifier,如下图所示:

优秀开源代码解读:RESTKit的使用教程_第15张图片

 

Stylin’ the TableViewCells

在上面的storyboard图像中另一个选项是TableViewCell的风格。默认是Basic,即在cell中提供了一个左对齐的文本标签。其他可提供的选项是:

优秀开源代码解读:RESTKit的使用教程_第16张图片

 

这些选项使你有可能在主视图中呈现你所选择的细节。比如,如果你使用一个app来寻找附近的咖啡店,如果我们可以看到看到每一个商店离我现在的距离,这将多么的美好。没有人会想要去很远的地方只为了一杯咖啡。

 

现在,使用Right Detail style来显示名字和距离。在下拉菜单中把原来的“Basic”风格改成“Right Detail style”

 

在下面的JSON数据中,“location”字段中就是距离

  
  
  
  
  1. "location": { 
  2.         "address""201 Castro St.",  
  3.         "city""Mountain View",  
  4.         "country""United States",  
  5.         "crossStreet""at Villa St.",  
  6.         "distance": 8315,  
  7.         "lat": 37.393803003654625,  
  8.         "lng": -122.07888155105633,  
  9.         "postalCode""94041",  
  10.         "state""CA" 
  11.     },  

 

为了使这些数据可以被RestKit取出,创建一个位置数据模型并提供映射。以下是步骤:

1.新建一个文件命名为“Location”,并把它设为NSObject的子类。

2.在 Location.h,增加:

  
  
  
  
  1. @property (nonatomic, strong) NSString *address; 
  2. @property (nonatomic, strong) NSString *city; 
  3. @property (nonatomic, strong) NSString *country; 
  4. @property (nonatomic, strong) NSString *crossStreet; 
  5. @property (nonatomic, strong) NSString *postalCode; 
  6. @property (nonatomic, strong) NSString *state; 
  7. @property (nonatomic, strong) NSNumber *distance; 
  8. @property (nonatomic, strong) NSNumber *lat; 
  9. @property (nonatomic, strong) NSNumber *lng; 

请确保这些属性有在 Location.m中被synthesize化!

 

3.现在在Venue.h中增加::

  
  
  
  
  1. #import "Location.h" 
  2.   
  3. @property (strong, nonatomic) Location *location; 

在Venue.m中synthesize属性location。

 

4.在 MasterViewController.m,增加viewDidLoad中增加位置映射(在调用sendRequest之前)

  
  
  
  
  1. RKObjectMapping *locationMapping = [RKObjectMapping mappingForClass:[Location class]]; 
  2.   [locationMapping mapKeyPathsToAttributes:@"address", @"address", @"city", @"city", @"country", @"country", @"crossStreet", @"crossStreet", @"postalCode", @"postalCode", @"state", @"state", @"distance", @"distance", @"lat", @"lat", @"lng", @"lng", nil]; 
  3.  
  4.   [venueMapping mapRelationship:@"location" withMapping:locationMapping]; 
  5.   [objectManager.mappingProvider setMapping:locationMapping forKeyPath:@"location"]; 

 

这和你先前做的Venue映射是十分相似,除了:

mapRelationship:withMapping:. 他通知你的地点映射实例来使用他的位置属性。

setMapping:forKeyPath: 则是告诉objectManager根据JSON数据中的位置键去使用位置映射。

 

5.修改 tableView:cellForRowAtIndexPath: 为:

  
  
  
  
  1. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 
  2. Venue *venue = [data objectAtIndex:indexPath.row]; 
  3. cell.textLabel.text = [venue.name length] > 24 ? [venue.name substringToIndex:24] : venue.name; 
  4. cell.detailTextLabel.text = [NSString stringWithFormat:@"%.0fm", [venue.location.distance floatValue]]; 
  5. return cell; 

 

编译运行。现在你会看见一些东西像如下图:

优秀开源代码解读:RESTKit的使用教程_第17张图片

字母m代表的的是米,不是英里。请记得我们还在使用苹果的经纬度(译者注:模拟器默认位置是在苹果公司总部)—-如果你想你可以换成你自己的经纬度。想要获得更多怎么做的教程

点击这里.

 

自定义TableViewCells

让我们也把FourSquare的checkins也在我们的表视图中显示出来。要做到这一点,我们需要创建一个自定义的表视图元件。

 

在MainStoryboard中,把TableViewCell的style属性改成Custom。默认的文本标签会消失。在Size Inspector中改变列高度为Custom 并从44改成64。请确保你也为Tableview的rowHeight设置成了64。

优秀开源代码解读:RESTKit的使用教程_第18张图片
 
现在增加3个文本标签,就像这样:

请注意你可以使用自定义样式去纳入更多的详细信息到主屏幕。不要太多,足够就行。

 

因为tableViewCell现在被设置成了Custom,你不能使用UITableViewCell的textLabel 、detailTextLabel属性去增加文字。这意味着为了个别标签,你需要创建一个UITableViewCell的子类,里面有着被outlets 声明的venue name, distance, and check-ins。

 

用Objective-C类模版创建一个新文件。命名为VenueCell并设置为UITableViewCell的子类。

 

按下面修改 VenueCell.h :

  
  
  
  
  1. #import <UIKit/UIKit.h> 
  2.   
  3. @interface VenueCell : UITableViewCell 
  4.   
  5. @property (strong, nonatomic) IBOutlet UILabel *nameLabel; 
  6. @property (strong, nonatomic) IBOutlet UILabel *distanceLabel; 
  7. @property (strong, nonatomic) IBOutlet UILabel *checkinsLabel; 
  8.   
  9. @end 

修改 VenueCell.m为:

  
  
  
  
  1. #import "VenueCell.h" 
  2.   
  3. @implementation VenueCell 
  4. @synthesize nameLabel, distanceLabel, checkinsLabel; 
  5.   
  6. @end 

正如你所见,这个类并没有做什么:它只是增加了nameLabel, distanceLabel、 checkinsLabel.的属性。

 

回到MainStoryboard.storyboard,选择prototype cell,设置他的类为VenueCell。并且,在Attributes Inspector中,改变识别码为“VenueCell”

优秀开源代码解读:RESTKit的使用教程_第19张图片

这些项不需要去匹配,但是最好匹配下他们为了清晰和一致性。

 

现在连接那些VenueCell 中的outlets到文本标签。在Connections Inspector中,连接Outlets:nameLabel, distanceLabel 、heckinsLabel到他们各自的UILabels。

优秀开源代码解读:RESTKit的使用教程_第20张图片

在MasterViewController.m: 的顶部增加VenueCell 的引用

  
  
  
  
  1. #import "VenueCell.h" 

并改变MasterViewController中的 tableView:cellForRowAtIndex:

  
  
  
  
  1. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 
  2. Venue *venue = [data objectAtIndex:indexPath.row]; 
  3. cell.textLabel.text = [venue.name length] > 25 ? [venue.name substringToIndex:25] : venue.name; 
  4. cell.detailTextLabel.text = [NSString stringWithFormat:@"%.0fm", [venue.location.distance floatValue]]; 
  5. return cell; 

 为:

  
  
  
  
  1. VenueCell *cell = [tableView dequeueReusableCellWithIdentifier:@"VenueCell"]; 
  2.    Venue *venue = [data objectAtIndex:indexPath.row]; 
  3.    cell.nameLabel.text = [venue.name length] > 25 ? [venue.name substringToIndex:25] : venue.name; 
  4.    cell.distanceLabel.text = [NSString stringWithFormat:@"%.0fm", [venue.location.distance floatValue]]; 
  5.    cell.checkinsLabel.text = [NSString stringWithFormat:@"%d checkins", [venue.stats.checkins intValue]]; 
  6.    return cell; 

 如果你尝试编译和运行这将不起作用,因为Venue并没有一个统计属性。正如位置数据一样,Foursquare网站也在JSON数据中提供了统计数据

  
  
  
  
  1. "stats": { 
  2.         "checkinsCount": 3552,  
  3.         "tipCount": 42,  
  4.         "usersCount": 1089 
  5.     },  

 

如同位置数据一样,你需要创建一个统计数据的模型并提供映射给RestKit

1.创建一个新文件并命名为“Stats,”,并设置为NSOjbect的子类。

2.在Stats.h中增加:

  
  
  
  
  1. @property (nonatomic, strong) NSNumber *checkins; 
  2. @property (nonatomic, strong) NSNumber *tips; 
  3. @property (nonatomic, strong) NSNumber *users; 

在m文件中synthesize化。

 

3.在Venue.h中增加

  
  
  
  
  1. #import "Stats.h" 
  2.   
  3. @property (strong, nonatomic) Stats *stats; 

 Venue.m 中的synthesize 状态 .

 

4.在MasterViewController.m的viewDidLoad中增加位置的映射(在sendRequest之前):

  
  
  
  
  1. RKObjectMapping *statsMapping = [RKObjectMapping mappingForClass:[Stats class]]; 
  2. [statsMapping mapKeyPathsToAttributes:@"checkinsCount", @"checkins", @"tipCount", @"tips", @"usersCount", @"users", nil]; 
  3.  
  4. [venueMapping mapRelationship:@"stats" withMapping:statsMapping]; 
  5. [objectManager.mappingProvider setMapping:statsMapping forKeyPath:@"stats"]; 

 

编译运行,你可以看见像这样的东西:

优秀开源代码解读:RESTKit的使用教程_第21张图片

谁会想到,Kaiser Permanente竟然会被星巴克更流行!

 

注意: 如果在这个地方你会崩,复查来确保你在MainStoryboard.storyboard中设置识别码为“VenueCell”

 

何去何从?

这里给出以上教程所有的代码  。

下面给出你刚才所做的事情:

1.用Master-Detail Application template.来使用UITableView

2.RestKit的安装和配置。

3.为你的app配置Foursquare并介绍了他们的街道api

4.为你的app创建数据模型

5.建立RestKit的映射让其可以请求,接受,解析数据进你的数据模型

6.创建一个自定义的表视图元件来显示Foursquare的数据

 

你没有做的是:

1.安装并使用NSURLConnections or NSURLConnectionDelegates.

2.解析JSON或XML数据

3.把JSON或XML响应到你自己的对象。

 

因为RestKit都帮你做好了这些事情!不赖吧?从这里,免费设定Foursquare的用户认证来增加对Foursquare API和其例子扩展的更多特性,或找一些其他的你可以使用RestKit 来获取数据的web services

原文地址:http://www.cocoachina.com/applenews/devnews/2014/0102/7641.html


你可能感兴趣的:(Web,cocoa,Objective-C,web服务器,touch,Services,Restkit开源框架)