mirror of
https://github.com/zhigang1992/RestKit.git
synced 2026-04-06 22:39:42 +08:00
125 lines
6.0 KiB
Objective-C
125 lines
6.0 KiB
Objective-C
//
|
|
// RKTwitterAppDelegate.m
|
|
// RKTwitter
|
|
//
|
|
// Created by Blake Watters on 9/5/10.
|
|
// Copyright (c) 2009-2012 RestKit. All rights reserved.
|
|
//
|
|
|
|
#import <RestKit/RestKit.h>
|
|
#import <RestKit/CoreData.h>
|
|
#import "RKTwitterAppDelegate.h"
|
|
#import "RKTwitterViewController.h"
|
|
#import "RKTStatus.h"
|
|
|
|
@implementation RKTwitterAppDelegate
|
|
|
|
#pragma mark -
|
|
#pragma mark Application lifecycle
|
|
|
|
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
|
|
{
|
|
// Initialize RestKit
|
|
NSURL *baseURL = [NSURL URLWithString:@"http://twitter.com"];
|
|
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:baseURL];
|
|
|
|
// Enable automatic network activity indicator management
|
|
objectManager.client.requestQueue.showsNetworkActivityIndicatorWhenBusy = YES;
|
|
|
|
// Initialize managed object store
|
|
NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
|
|
RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];
|
|
objectManager.managedObjectStore = managedObjectStore;
|
|
[managedObjectStore release];
|
|
|
|
// 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!
|
|
*/
|
|
RKEntityMapping *userMapping = [RKEntityMapping mappingForEntityForName:@"RKTUser" inManagedObjectStore:managedObjectStore];
|
|
userMapping.primaryKeyAttribute = @"userID";
|
|
[userMapping mapKeyPath:@"id" toAttribute:@"userID"];
|
|
[userMapping mapKeyPath:@"screen_name" toAttribute:@"screenName"];
|
|
[userMapping mapAttributes:@"name", nil];
|
|
|
|
RKEntityMapping *statusMapping = [RKEntityMapping mappingForEntityForName:@"RKTStatus" inManagedObjectStore:managedObjectStore];
|
|
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" withMapping:userMapping];
|
|
|
|
// Update date format so that we can parse Twitter dates properly
|
|
// Wed Sep 29 15:31:08 +0000 2010
|
|
[RKObjectMapping addDefaultDateFormatterForString:@"E MMM d HH:mm:ss Z y" inTimeZone:nil];
|
|
|
|
// Register our mappings with the provider
|
|
[objectManager.mappingProvider setObjectMapping:statusMapping forResourcePathPattern:@"/status/user_timeline/:username"];
|
|
|
|
// 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:
|
|
// 1) RESTKIT_GENERATE_SEED_DB is defined in the 'Preprocessor Macros' section of the build setting for the target
|
|
// This is what triggers the conditional compilation to cause the seed database to be built
|
|
// 2) Source JSON files are added to the 'Generate Seed Database' target to be copied into the bundle. This is required
|
|
// so that the object seeder can find the files when run in the simulator.
|
|
#ifdef RESTKIT_GENERATE_SEED_DB
|
|
RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelInfo);
|
|
RKLogConfigureByName("RestKit/CoreData", RKLogLevelTrace);
|
|
|
|
NSError *error;
|
|
NSString *seedStorePath = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"RKSeedDatabase.sqlite"];
|
|
RKManagedObjectImporter *importer = [[RKManagedObjectImporter alloc] initWithManagedObjectModel:managedObjectModel storePath:seedStorePath];
|
|
[importer importObjectsFromItemAtPath:[[NSBundle mainBundle] pathForResource:@"restkit" ofType:@"json"]
|
|
withMapping:statusMapping
|
|
keyPath:nil
|
|
error:&error];
|
|
[importer importObjectsFromItemAtPath:[[NSBundle mainBundle] pathForResource:@"users" ofType:@"json"]
|
|
withMapping:userMapping
|
|
keyPath:@"user"
|
|
error:&error];
|
|
BOOL success = [importer finishImporting:&error];
|
|
if (success) {
|
|
[importer logSeedingInfo];
|
|
} else {
|
|
RKLogError(@"Failed to finish import and save seed database due to error: %@", error);
|
|
}
|
|
#else
|
|
/**
|
|
Complete Core Data stack initialization
|
|
*/
|
|
[managedObjectStore createPersistentStoreCoordinator];
|
|
NSString *storePath = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"RKTwitter.sqlite"];
|
|
NSString *seedPath = [[NSBundle mainBundle] pathForResource:@"RKSeedDatabase" ofType:@"sqlite"];
|
|
NSError *error;
|
|
NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:storePath fromSeedDatabaseAtPath:seedPath error:&error];
|
|
NSAssert(persistentStore, @"Failed to add persistent store with error: %@", error);
|
|
|
|
// Create the managed object contexts
|
|
[managedObjectStore createManagedObjectContexts];
|
|
|
|
// Configure a managed object cache to ensure we do not create duplicate objects
|
|
managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:managedObjectStore.primaryManagedObjectContext];
|
|
#endif
|
|
|
|
// Create Window and View Controllers
|
|
RKTwitterViewController *viewController = [[[RKTwitterViewController alloc] initWithNibName:nil bundle:nil] autorelease];
|
|
UINavigationController *controller = [[UINavigationController alloc] initWithRootViewController:viewController];
|
|
UIWindow *window = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
|
|
[window addSubview:controller.view];
|
|
[window makeKeyAndVisible];
|
|
|
|
return YES;
|
|
}
|
|
|
|
@end
|