mirror of
https://github.com/zhigang1992/RestKit.git
synced 2026-04-24 04:46:01 +08:00
Implementation of Object Mapping 2.0 design:
* Removed RestKit from inheritance hierarchy * Mappings are implemented as concrete classes * Mapper is much more flexible & powerful * Much more robust error handling * Serialization is reimplemented as an object mapping operation * Added ability to serialize to JSON natively * Reworked Core Data integration * Simplified the codebase substantially
This commit is contained in:
@@ -11,7 +11,6 @@
|
||||
#import "RKTwitterAppDelegate.h"
|
||||
#import "RKTwitterViewController.h"
|
||||
#import "RKTStatus.h"
|
||||
#import "RKTUser.h"
|
||||
|
||||
@implementation RKTwitterAppDelegate
|
||||
|
||||
@@ -21,20 +20,52 @@
|
||||
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
|
||||
// Initialize RestKit
|
||||
RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:@"http://twitter.com"];
|
||||
RKObjectMapper* mapper = objectManager.mapper;
|
||||
|
||||
// Enable automatic network activity indicator management
|
||||
[RKRequestQueue sharedQueue].showsNetworkActivityIndicatorWhenBusy = YES;
|
||||
|
||||
// Update date format so that we can parse twitter dates properly
|
||||
// Initialize object store
|
||||
objectManager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:@"RKTwitterData.sqlite" usingSeedDatabaseName:RKDefaultSeedDatabaseFileName managedObjectModel:nil];
|
||||
|
||||
// Setup our object mappings
|
||||
/*!
|
||||
Mapping by entity. Here we are configuring a mapping by targetting a Core Data entity with a specific
|
||||
name. This allows us to map back Twitter user objects directly onto NSManagedObject instances --
|
||||
there is no backing model class!
|
||||
*/
|
||||
RKManagedObjectMapping* userMapping = [RKManagedObjectMapping mappingForEntityWithName:@"RKTUser"];
|
||||
userMapping.primaryKeyAttribute = @"userID";
|
||||
[userMapping mapKeyPath:@"id" toAttribute:@"userID"];
|
||||
[userMapping mapKeyPath:@"screen_name" toAttribute:@"screenName"];
|
||||
[userMapping mapAttributes:@"name", nil];
|
||||
|
||||
/*!
|
||||
Map to a target object class -- just as you would for a non-persistent class. The entity is resolved
|
||||
for you using the Active Record pattern where the class name corresponds to the entity name within Core Data.
|
||||
Twitter status objects will be mapped onto RKTStatus instances.
|
||||
*/
|
||||
RKManagedObjectMapping* statusMapping = [RKManagedObjectMapping mappingForClass:[RKTStatus class]];
|
||||
statusMapping.primaryKeyAttribute = @"statusID";
|
||||
[statusMapping mapKeyPathsToAttributes:@"id", @"statusID",
|
||||
@"created_at", @"createdAt",
|
||||
@"text", @"text",
|
||||
@"url", @"urlString",
|
||||
@"in_reply_to_screen_name", @"inReplyToScreenName",
|
||||
@"favorited", @"isFavorited",
|
||||
nil];
|
||||
[statusMapping mapRelationship:@"user" withObjectMapping:userMapping];
|
||||
|
||||
// Update date format so that we can parse Twitter dates properly
|
||||
// Wed Sep 29 15:31:08 +0000 2010
|
||||
NSMutableArray* dateFormats = [[[mapper dateFormats] mutableCopy] autorelease];
|
||||
[dateFormats addObject:@"E MMM d HH:mm:ss Z y"];
|
||||
[mapper setDateFormats:dateFormats];
|
||||
|
||||
// Add our element to object mappings
|
||||
[mapper registerClass:[RKTUser class] forElementNamed:@"user"];
|
||||
[mapper registerClass:[RKTStatus class] forElementNamed:@"status"];
|
||||
[statusMapping.dateFormatStrings addObject:@"E MMM d HH:mm:ss Z y"];
|
||||
|
||||
// Register our mappings with the provider
|
||||
[objectManager.mappingProvider setMapping:userMapping forKeyPath:@"user"];
|
||||
[objectManager.mappingProvider setMapping:statusMapping forKeyPath:@"status"];
|
||||
|
||||
// Uncomment this to use XML, comment it to use JSON
|
||||
// objectManager.acceptMIMEType = RKMIMETypeXML;
|
||||
// [objectManager.mappingProvider setMapping:statusMapping forKeyPath:@"statuses.status"];
|
||||
|
||||
// Database seeding is configured as a copied target of the main application. There are only two differences
|
||||
// between the main application target and the 'Generate Seed Database' target:
|
||||
@@ -46,7 +77,7 @@
|
||||
RKManagedObjectSeeder* seeder = [RKManagedObjectSeeder objectSeederWithObjectManager:objectManager];
|
||||
|
||||
// Seed the database with instances of RKTStatus from a snapshot of the RestKit Twitter timeline
|
||||
[seeder seedObjectsFromFile:@"restkit.json" toClass:[RKTStatus class] keyPath:nil];
|
||||
[seeder seedObjectsFromFile:@"restkit.json" withObjectMapping:statusMapping];
|
||||
|
||||
// Seed the database with RKTUser objects. The class will be inferred via element registration
|
||||
[seeder seedObjectsFromFiles:@"users.json", nil];
|
||||
@@ -54,13 +85,10 @@
|
||||
// Finalize the seeding operation and output a helpful informational message
|
||||
[seeder finalizeSeedingAndExit];
|
||||
|
||||
// NOTE: If all of your mapped objects use element -> class registration, you can perform seeding in one line of code:
|
||||
// NOTE: If all of your mapped objects use keyPath -> objectMapping registration, you can perform seeding in one line of code:
|
||||
// [RKManagedObjectSeeder generateSeedDatabaseWithObjectManager:objectManager fromFiles:@"users.json", nil];
|
||||
#endif
|
||||
|
||||
// Initialize object store
|
||||
objectManager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:@"RKTwitterData.sqlite" usingSeedDatabaseName:RKDefaultSeedDatabaseFileName managedObjectModel:nil];
|
||||
|
||||
// Create Window and View Controllers
|
||||
RKTwitterViewController* viewController = [[[RKTwitterViewController alloc] initWithNibName:nil bundle:nil] autorelease];
|
||||
UINavigationController* controller = [[UINavigationController alloc] initWithRootViewController:viewController];
|
||||
|
||||
Reference in New Issue
Block a user