RestKit使用ObjectManager方式处理JSON数据
很多iPhone应用程序需要与服务器进行通信,现在移动平台使用较多的通信格式为JSON,而使用RestKit是处理JSON通信是一种较为常用的方法。
使用RestKit进行JSON的请求有两种方式,我称他们为client方式和object manager方式。现在先不讨论client方式,着重说object manager方式。使用object manager方式的一个特点就是需要将JSON格式的数据映射到本地的类中,那么在获得JSON中的数据之前,我们需要进行本地类的定义,保持本地类和服务器获得的JSON数据格式相对应。
做完映射后,我们就可以从服务器请求数据了,JSON数据从服务器拿到本地后就可以直接映射到我们自己定义的那个类上,并创建实例从而使用它。需要用到的头文件:
#import <RestKit/RestKit.h>
#import <RestKit/CoreData/CoreData.h>
Object manager方式步骤:
步骤一:初始化
[RKObjectManager objectManagerWithBaseURL:@"http://10.108.14.2"];
在初始化步骤中,我们指定了服务器的基础地址,以后我们要进行的请求操作都是基于该URL的相对地址。所以我们可以将这一句放到应用程序的初始化函数位置。
步骤二:建立本地类
假设我们从服务器获得的JSON格式数据如下:
[{"memberId":"100001",
"consultContent":"商品是正品吗?",
"consultTime":1320906249620,
"replyTime":1320906249620,
"replyContent":"绝对正品!假一赔十!",
"replyerName":"客服人员"},
{"memberId":"100002",
"consultContent":"快递多长时间?",
"consultTime":1320906249620,
"replyTime":1320906249620,
"replyContent":"1周!",
"replyerName":"客服人员"},
{"memberId":"100003",
"consultContent":"有没有赠品?",
"consultTime":1320906249620,
"replyTime":1320906249620,
"replyContent":"有!原装贴膜",
"replyerName":"客服人员"}]
那么我们可以建立这样的类:
#import <Foundation/Foundation.h>
@interface RetailAskClass : NSObject
{
NSString *memberId;
NSNumber *consultTime;
NSString *replyContent;
NSNumber *replyTime;
NSString *consultContent;
NSString *replyerName;
}
@property (nonatomic, retain) NSString *memberId;
@property (nonatomic, retain) NSNumber *consultTime;
@property (nonatomic, retain) NSString *replyContent;
@property (nonatomic, retain) NSNumber *replyTime;
@property (nonatomic, retain) NSString *consultContent;
@property (nonatomic, retain) NSString *replyerName;
@end
@implementation RetailAskClass
@synthesize memberId;
@synthesize consultTime;
@synthesize replyContent;
@synthesize replyTime;
@synthesize consultContent;
@synthesize replyerName;
步骤三:JSON字段与本地类字段的映射并请求服务器数据
本地类建立完毕之后我们就可以指定JSON格式中的特定字段映射到本地类的字段中。
- (void)viewDidAppear:(BOOL)animated
{
RKObjectMapping* retailAskMapping = [RKObjectMapping mappingForClass:[RetailAskClass class]];
[retailAskMapping mapKeyPath:@"memberId" toAttribute:@"memberId"];
[retailAskMapping mapKeyPath:@"consultTime" toAttribute:@"consultTime"];
[retailAskMapping mapKeyPath:@"replyContent" toAttribute:@"replyContent"];
[retailAskMapping mapKeyPath:@"replyTime" toAttribute:@"replyTime"];
[retailAskMapping mapKeyPath:@"consultContent" toAttribute:@"consultContent"];
[retailAskMapping mapKeyPath:@"replyerName" toAttribute:@"replyerName"];
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/ shopping/retail/consultlist/1001" objectMapping:retailAskMapping delegate:self];
}
最后一句是服务器请求语句,指定相对于基础URL的相对地址。
步骤四:开始请求并回调处理JSON
映射全部做完之后我们就可以进行服务器请求了,在请求之前我们需要在当前试图控制器的.h文件中实现<RKObjectLoaderDelegate>协议。然后在.m文件中添加如下:
-(void)objectLoader:(RKObjectLoader *)objectLoader didFailWithError:(NSError *)error
{
}
-(void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects
{
RetailAsk *retailAsk = [[RetailAsk alloc]initWithConsultArray:result arrayCount:[objects count]];
}
在回调函数中我们便可以获得系统为我们自动创建的objects对象数组,从中我们可以访问已经建立映射的对象,并访问其中的字段。