restkit - from zero to hero

37
RestKit From Zero to Hero Peter Friese, Zühlke Engineering

Upload: zuehlke

Post on 15-May-2015

1.667 views

Category:

Technology


2 download

DESCRIPTION

RestKit - From Zero to HeroThis talk explains what RestKit is and how it can help you build applications that sync with REST services.

TRANSCRIPT

Page 1: RestKit - From Zero to Hero

RestKitFrom Zero to Hero

Peter Friese, Zühlke Engineering

Page 2: RestKit - From Zero to Hero

Integrating Twitter in Your iOS 5 Apps

@[email protected]/peterhttp://peterfriese.de

Peter Friese

Page 3: RestKit - From Zero to Hero

What we will cover today

1

2

3

Challenges

How can RestKit help?

Demos!

Page 4: RestKit - From Zero to Hero

Challenges...

Flaky Connectivity

Page 5: RestKit - From Zero to Hero

Challenges...

Flaky Connectivity

Different Data Formats

Page 6: RestKit - From Zero to Hero

Challenges...

Flaky Connectivity

Different Data Formats

Offline Data Access

Page 7: RestKit - From Zero to Hero

2

How can RestKit help?

Page 8: RestKit - From Zero to Hero

RestKit Features

Integrated HTTP Stack

Pluggable Parser

Object Mapping

Core Data Integration

Page 9: RestKit - From Zero to Hero

Integrated HTTP Stack

// create clientRKClient *client = [RKClient clientWithBaseURL:@"http://github.org"];

// send this field with each request[client setValue:[[UIDevice currentDevice] uniqueIdentifier] forHTTPHeaderField:@"UDID"];

Page 10: RestKit - From Zero to Hero

Integrated HTTP Stack

- (IBAction)forkYou:(id)sender { [[RKClient sharedClient]

get:@"https://github.com/fluidicon.png" delegate:self];

}

- (void)request:(RKRequest *)request didLoadResponse:(RKResponse *)response

{ if ([response isSuccessful]) { UIImage *image =

[UIImage imageWithData:[response body]]; self.imageView.image = image; }}

Page 11: RestKit - From Zero to Hero

Integrated HTTP StackPluggable Parser Object Mapping

JSON(new and cool)

XML(legacy)

Page 12: RestKit - From Zero to Hero

Integrated HTTP StackPluggable Parser Object Mapping

#->

Page 13: RestKit - From Zero to Hero

Integrated HTTP StackPluggable Parser Object Mapping

@interface GithubUser : NSObject

@property (strong, nonatomic) NSNumber *id;

@property (strong, nonatomic) NSString *name;

@property (strong, nonatomic) NSString *location;

@property (strong, nonatomic) NSString *followers;

@property (strong, nonatomic) NSString *email;

@property (strong, nonatomic) NSString *following;

@end

->

Page 14: RestKit - From Zero to Hero

Integrated HTTP StackPluggable Parser Object Mapping

->RKObjectMapping *objectMapping = [RKObjectMapping mappingForClass:[GithubUser class]];

[objectMapping mapKeyPath:@"user.id" toAttribute:@"id"];[objectMapping mapKeyPath:@"user.name" toAttribute:@"name"];[objectMapping mapKeyPath:@"user.location" toAttribute:@"location"]; [objectMapping mapKeyPath:@"user.following-count" toAttribute:@"following"]; [objectMapping mapKeyPath:@"user.followers-count" toAttribute:@"followers"]

XML(legacy

)

register mapping

for a class

configure mapping (KVC)

Page 15: RestKit - From Zero to Hero

Integrated HTTP StackPluggable Parser Object Mapping

-><user> <name>Peter Friese <following-count">36 <email>[email protected] <followers-count">42 <location>Hamburg <id>232107</user>

XML(legacy

)

@interface GithubUser@property id;@property name;@property location;@property followers;@property email;@property following;@end

(simplified code illustration, please bear with me!)

[objectMapping mapKeyPath:@"user.id" toAttribute:@"id"];

Page 16: RestKit - From Zero to Hero

Integrated HTTP StackPluggable Parser Loading Objects

->RKObjectManager *objectManager = [RKObjectManager objectManagerWithBaseURL:@"https://github.com"];

[objectManager loadObjectsAtResourcePath:[NSString stringWithFormat:@"api/v2/xml/user/show/%@", userName]objectMapping:objectMappingdelegate:self];

- (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects { GithubUser *user = [objects objectAtIndex:0];}

XML(legacy

)

can easily switch between

dev / prod

Page 17: RestKit - From Zero to Hero

Integrated HTTP Stack Pluggable Parser

RKObjectManager *objectManager = [RKObjectManager objectManagerWithBaseURL:@"https://github.com"];

// we want to send and receive JSONobjectManager.serializationMIMEType = RKMIMETypeJSON;objectManager.acceptMIMEType = RKMIMETypeJSON;

[objectManager loadObjectsAtResourcePath:[NSString stringWithFormat:@"api/v2/json/user/show/%@", userName]objectMapping:self.mappingdelegate:self];

- (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects { GithubUser *user = [objects objectAtIndex:0];}

Page 18: RestKit - From Zero to Hero

Integrated HTTP Stack Pluggable Parser

RKObjectManager *objectManager = [RKObjectManager objectManagerWithBaseURL:@"https://github.com"];

// we want to send and receive JSONobjectManager.serializationMIMEType = RKMIMETypeJSON;objectManager.acceptMIMEType = RKMIMETypeJSON;

[objectManager loadObjectsAtResourcePath:[NSString stringWithFormat:@"api/v2/json/user/show/%@", userName]objectMapping:self.mappingdelegate:self];

- (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects { GithubUser *user = [objects objectAtIndex:0];}

XML(legacy

)JSON(new

and cool

)

:-)

Page 19: RestKit - From Zero to Hero

Integrated HTTP StackPluggable Parser Object Mapping

->RKObjectMapping *objectMapping = [RKObjectMapping mappingForClass:[GithubUser class]];

[objectMapping mapKeyPath:@"user.id" toAttribute:@"id"];[objectMapping mapKeyPath:@"user.name" toAttribute:@"name"];[objectMapping mapKeyPath:@"user.location" toAttribute:@"location"]; [objectMapping mapKeyPath:@"user.following_count" toAttribute:@"following"]; [objectMapping mapKeyPath:@"user.followers_count" toAttribute:@"followers"]

JSONregister mapping

for a class

configure mapping (KVC)

Page 20: RestKit - From Zero to Hero

Integrated HTTP StackPluggable Parser Object Mapping

->{user: {followers_count: 42,location: "Hamburg",following_count: 36,email: “[email protected],blog: "http://www.peterfriese.de",name: "Peter Friese",id: 232107,}

}

JSON

@interface GithubUser@property id;@property name;@property location;@property followers;@property email;@property following;@end

(simplified code illustration, please bear with me!)

[objectMapping mapKeyPath:@"user.id" toAttribute:@"id"];

Page 21: RestKit - From Zero to Hero

Integrated HTTP StackPluggable Parser Object Mapping

->Relation

ships

[issueMapping mapKeyPath:@"user" toRelationship:@"user" withMapping:userMapping];

Page 22: RestKit - From Zero to Hero

Integrated HTTP StackPluggable Parser POSTing Objects

->

[[objectManager mappingProvider] setObjectMapping:issueMapping forKeyPath:@""];

RKObjectMapping *issueSerializationMapping = [issueMapping inverseMapping];

[[objectManager mappingProvider] setSerializationMapping:issueSerializationMapping forClass:[GithubIssue class]];

[[objectManager router] routeClass:[GithubIssue class] toResourcePath:@"/repos/:repouser/:repo/issues/:number"];

[[objectManager router] routeClass:[GithubIssue class] toResourcePath:@"/repos/:repouser/:repo/issues" forMethod:RKRequestMethodPOST ];

Page 23: RestKit - From Zero to Hero

Integrated HTTP StackPluggable Parser POSTing Objects

->

GithubIssue *issue = [[GithubIssue alloc] init];

issue.repouser = repouser;issue.repo = repo;

[[RKObjectManager sharedManager] postObject:issue delegate:self];

Create new object

Infos for RestKit router:

POST object:

Page 24: RestKit - From Zero to Hero

Integrated HTTP StackPluggable ParserObject Mapping Core Data Integration

Offline Data Access

Remember?

Page 25: RestKit - From Zero to Hero

Integrated HTTP StackPluggable ParserObject Mapping Core Data Integration

Change Mapped Objects

Add a Core Data ModelRegister a Managed Object Store

Adjust Object Mappings

Adjust Object CreationFetch Data from DB / Backend

Page 26: RestKit - From Zero to Hero

Integrated HTTP StackPluggable ParserObject Mapping Change Mapped Objects

@interface GithubUser : NSManagedObject

@interface GithubUser : NSObject

@synthesize id;@synthesize login;@synthesize name;@synthesize company;@synthesize location;@synthesize blog;@synthesize following;@synthesize followers;@synthesize email;

@dynamic id;@dynamic login;@dynamic name;@dynamic company;@dynamic location;@dynamic blog;@dynamic following;@dynamic followers;@dynamic email;

Header Header

Module Module

Page 27: RestKit - From Zero to Hero

Integrated HTTP StackPluggable ParserObject Mapping Add a Core Data Model

Page 28: RestKit - From Zero to Hero

Integrated HTTP StackPluggable ParserObject Mapping Add a Core Data Model

Keep in mind:Assign respective

classes to managed objects!

@interface GithubUser : NSObject

Page 29: RestKit - From Zero to Hero

Integrated HTTP StackPluggable ParserObject Mapping Register a Managed Object Store

// set up object managerRKObjectManager *objectManager = [RKObjectManager objectManagerWithBaseURL:@"https://api.github.com"];

// set up backing data storeobjectManager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:@"github.sqlite"];

Page 30: RestKit - From Zero to Hero

Integrated HTTP StackPluggable ParserObject Mapping Adjust Object Mappings

RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[GithubUser class]];

RKManagedObjectMapping *userMapping = [RKManagedObjectMapping mappingForClass:[GithubUser class]];

Page 31: RestKit - From Zero to Hero

Integrated HTTP StackPluggable ParserObject Mapping Adjust Object Creation

GithubIssue *issue = [[GithubIssue alloc] init];

GithubIssue *issue = [GithubIssue object];

Page 32: RestKit - From Zero to Hero

Integrated HTTP StackPluggable ParserObject Mapping Fetch Data from DB / Backend

if ([[RKObjectManager sharedManager] isOnline]) {[self fetchDataFromRemote];

}else {[self fetchDataFromDataStore];

}

Online of offline?

- (void)fetchDataFromDataStore{ repos = [GithubRepo allObjects]; [self.tableView reloadData]; }

Offline - Fetch from DB

Page 33: RestKit - From Zero to Hero

Integrated HTTP StackPluggable ParserObject Mapping Fetch Data from DB / Backend

- (void)fetchDataFromRemote{RKObjectMapping *mapping = [[[RKObjectManager sharedManager] mappingProvider] objectMappingForClass:[GithubRepo class]];

NSString *resourcePath = [NSString stringWithFormat:@"/users/%@/repos", loginInfo.login];

[[RKObjectManager sharedManager]loadObjectsAtResourcePath:resourcePath objectMapping:mappingdelegate:self];

}

Online - Fetch from Backend

Page 34: RestKit - From Zero to Hero

Integrated HTTP StackPluggable ParserObject Mapping Fetch Data from DB / Backend

- (void)reachabilityChanged:(NSNotification*)notification {RKReachabilityObserver* observer = (RKReachabilityObserver*)[notification object];

if ([observer isNetworkReachable]) {if (![self.view isHidden]) {[self fetchDataFromRemote];

}} else {if (![self.view isHidden]) {[self fetchDataFromDataStore];

}}

}

Reconnect after offline

Page 35: RestKit - From Zero to Hero

Integrated HTTP StackPluggable ParserObject Mapping Putting it All Together

Page 36: RestKit - From Zero to Hero

Thanks!

Page 37: RestKit - From Zero to Hero

Thanks!

Peter FriesePrincipal Consultant

Zühlke Engineering GmbHAm Sandtorkai 6620457 Hamburg

+49 151 108 604 72

Available for consulting,discussing all things mobileand frosty beverages

Mobile CouchDBPeter Friese

Di, 17:30 - 18:30

Auf Tuchfühlung mit smarten GerätenMasanori Fujita

Mi, 10:15 - 11:15