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

RestKit - From Zero to Hero

May 15, 2015

Download

Technology

Zühlke

RestKit - From Zero to Hero
This talk explains what RestKit is and how it can help you build applications that sync with REST services.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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