本系列的前面几篇:

RestKit学习1:引用RestKit项目
RestKit学习2:使用RestKit发送和接受请求 
RestKit学习3:CoreData 从模型到实体
RestKit学习4:Database Seeding(生成数据库文件)

这篇是从服务器的一个json接口直接获得数据,并把数据解析成对象。

需要解析的json字符串:

{"error":0,"message":"成功","list":[{"id":1,"name":"传祺","domestic":"国产","logo_ext":"jpg","logo_hash":"4081269f8b182a263b2e881e6c402a5c","seating":5},{"id":2,"name":"传祺GS5","domestic":"国产","logo_ext":"jpg","logo_hash":"b6da2a07ccd3ba7e48e0284524509a64","seating":5},{"id":3,"name":"E系列","domestic":"国产","logo_ext":null,"logo_hash":"d41d8cd98f00b204e9800998ecf8427e","seating":5},{"id":4,"name":"D系列","domestic":"进口","logo_ext":null,"logo_hash":"d41d8cd98f00b204e9800998ecf8427e","seating":3},{"id":5,"name":"V系列","domestic":"国产","logo_ext":null,"logo_hash":"d41d8cd98f00b204e9800998ecf8427e","seating":3}]}

json串对应的实体设置

注意图中的提示,一些保留字不应该出现。

RestKit学习5:Loading Remote Objects_json

如果中间出现错误:

“*** Assertion failure in -[RKManagedObjectMapping initWithEntity:] Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'The managedObjectClass for an object mapped entity cannot be nil.'”时,解决方法是DataModel.xcdatamodel重新生成一下实体类。

项目的引用看前面的文章。

AppDelegate.m 中Code

定义服务的地址,定义实体类跟json的映射关系

//
//  AppDelegate.m
//  testRestKit02
//
//  Created by cybercare on 12-7-30.
//  Copyright (c) 2012年
//
 
#import "AppDelegate.h"
#import <RestKit/RestKit.h>
#import <RestKit/CoreData.h>
 
#define DBNAME @"BAWSeed.sqlite"
 
 
@implementation AppDelegate
 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary
{
    // Setup the object manager
    RKObjectManager* objectManager = [RKObjectManagerobjectManagerWithBaseURLString:@"http://www.in4s.cn:8080/Inpads/android/"];
    
    // 需要存储的文件名
    objectManager.objectStore = [RKManagedObjectStoreobjectStoreWithStoreFilename:DBNAME];
    
    // json 文件和 Core Data对象属性映射关系。
    RKManagedObjectMapping* mapping = [RKManagedObjectMappingmappingForEntityWithName:@"Series"inManagedObjectStore:objectManager.objectStore];
    
    mapping.primaryKeyAttribute = @"sid";
rootKeyPath = @"list";
    
    [mapping mapKeyPath:@"id"toAttribute:@"sid"];
    [mapping mapKeyPath:@"name"toAttribute:@"sname"];
    [mapping mapKeyPath:@"domestic"toAttribute:@"domestic"];
    [mapping mapKeyPath:@"logo_ext"toAttribute:@"logo_ext"];
    [mapping mapKeyPath:@"logo_hash"toAttribute:@"logo_hash"];
    [mapping mapKeyPath:@"seating"toAttribute:@"seating"];
    
    // Register our mappings with the provider
    [objectManager.mappingProvidersetObjectMapping:mapping forResourcePathPattern:@"/sync/series"];
    
 
    #ifdef RESTKIT_GENERATE_SEED_DB
        // 需要生成数据库时用
        // Load all the data from the file series.json into a seed database
        // The seeder will print instructions for how to copy the data to your app
    
        RKManagedObjectSeeder * seeder = [RKManagedObjectSeederobjectSeederWithObjectManager:objectManager];
    
        [seeder seedObjectsFromFile:@"series.json"withObjectMapping:mapping];
        [seeder finalizeSeedingAndExit];
    #endif
 
    returnYES;
}
 
 
- (void)applicationWillResignActive:(UIApplication
{
}
 
- (void)applicationDidEnterBackground:(UIApplication
{
}
 
- (void)applicationWillEnterForeground:(UIApplication
{
}
 
- (void)applicationDidBecomeActive:(UIApplication
{
}
 
- (void)applicationWillTerminate:(UIApplication
{
}
 
 
 
@end
 
ViewController.m 中 Code
点击一个按钮是,向服务器的服务发送请求,并获得对象实例。
 
//
//  ViewController.m
//  testRestKit02
//
//  Created by cybercare on 12-7-30.
//  Copyright (c) 2012年
//
 
#import "ViewController.h"
#import <RestKit/RestKit.h>
#import "Series.h"
 
@interfaceViewController ()
 
@end
 
@implementation
 
- (void)viewDidLoad
{
    [superviewDidLoad];
}
 
- (void)viewDidUnload
{
    [superviewDidUnload];
}
 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
 
 
#pragma mark RKObjectLoaderDelegate methods
 
- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects {
   
NSLog(@"4444"
    
if ([objectLoader wasSentToResourcePath:@"/sync/series"]) {
 
for(Series* item in
        {
NSLog(@"%@,%@",item.sid,item.sname);
        }
    }
}
 
- (void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError:(NSError*)error {
    UIAlertView* alert = [[UIAlertViewalloc] initWithTitle:@"Error"
message:[error localizedDescription]
delegate:nil
cancelButtonTitle:@"OK" otherButtonTitles:nil] ;
show];
    NSLog(@"Hit error: %@", error);
    NSLog(@"Rats! Failed to load objects: %@", [error localizedDescription]);
 
}
 
- (void) ButtonWasPressed:(id)sender {
    
    RKObjectManager * objectManager = [RKObjectManagersharedManager];
    
    [objectManager loadObjectsAtResourcePath:@"/sync/series"delegate:self];
}
 
 
@end

 

 

这个过程中发生了什么?

1、在 AppDelegate.m 中配置json对象跟实体类的映射关系,在AppDelegate.m中定义是为了重复利用;
2、异步向服务器发送请求 loadObjectsAtResourcePath
3、服务器返回200,以及JSON body
4、RKObjectMapper parsed payload and mapped JSON data to 实体类
5、Callback invoked with array of Contacts

 

参考资料:

https://github.com/RestKit/RestKit/wiki/Tutorial-%3A-Introduction-to-RestKit