0408 system 2 gooogle dewan komisaris

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

Upload: upload123

Post on 04-Aug-2020

9 views

Category:

Education


0 download

DESCRIPTION

a umumnya. 4. Rapat Umum Pemegang Saham, yang selanjutnya disebut RUPS, adalah Organ Perseroan yang mempunyai wewenang yang tidak diberikan kepada Direksi atau Dewan Komisaris dalam batas yang ditentukan dalam Undang-Undang ini dan/atau anggaran dasar. 5. Direksi adalah Organ Perseroan yang berwenang dan bertanggung jawab penuh atas pengurusan Perseroan untuk kepentingan Perseroan, sesuai dengan maksud dan tujuan Perseroan serta mewakili Perseroan, baik di dalam maupun di luar pengadilan sesuai

TRANSCRIPT

Page 1: 0408 system 2 gooogle  Dewan Komisaris

RestKitFrom Zero to Hero

Peter Friese, Zühlke Engineering

Page 2: 0408 system 2 gooogle  Dewan Komisaris

Integrating Twitter in Your iOS 5 Apps

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

Peter Friese

Page 3: 0408 system 2 gooogle  Dewan Komisaris

What we will cover today

1

2

3

Challenges

How can RestKit help?

Demos!

Page 4: 0408 system 2 gooogle  Dewan Komisaris

Challenges...

Flaky Connectivity

Page 5: 0408 system 2 gooogle  Dewan Komisaris

Challenges...

Flaky Connectivity

Different Data Formats

Page 6: 0408 system 2 gooogle  Dewan Komisaris

Challenges...

Flaky Connectivity

Different Data Formats

Offline Data Access

Page 7: 0408 system 2 gooogle  Dewan Komisaris

2

How can RestKit help?

Page 8: 0408 system 2 gooogle  Dewan Komisaris

RestKit Features

Integrated HTTP Stack

Pluggable Parser

Object Mapping

Core Data Integration

Page 9: 0408 system 2 gooogle  Dewan Komisaris

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: 0408 system 2 gooogle  Dewan Komisaris

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: 0408 system 2 gooogle  Dewan Komisaris

Integrated HTTP StackPluggable Parser Object Mapping

JSON(new and cool)

XML(legacy)

Page 12: 0408 system 2 gooogle  Dewan Komisaris

Integrated HTTP StackPluggable Parser Object Mapping

#->

Page 13: 0408 system 2 gooogle  Dewan Komisaris

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: 0408 system 2 gooogle  Dewan Komisaris

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: 0408 system 2 gooogle  Dewan Komisaris

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: 0408 system 2 gooogle  Dewan Komisaris

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: 0408 system 2 gooogle  Dewan Komisaris

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: 0408 system 2 gooogle  Dewan Komisaris

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: 0408 system 2 gooogle  Dewan Komisaris

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: 0408 system 2 gooogle  Dewan Komisaris

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: 0408 system 2 gooogle  Dewan Komisaris

Integrated HTTP StackPluggable Parser Object Mapping

->Relation

ships

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

Page 22: 0408 system 2 gooogle  Dewan Komisaris

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: 0408 system 2 gooogle  Dewan Komisaris

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: 0408 system 2 gooogle  Dewan Komisaris

Integrated HTTP StackPluggable ParserObject Mapping Core Data Integration

Offline Data Access

Remember?

Page 25: 0408 system 2 gooogle  Dewan Komisaris

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: 0408 system 2 gooogle  Dewan Komisaris

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: 0408 system 2 gooogle  Dewan Komisaris

Integrated HTTP StackPluggable ParserObject Mapping Add a Core Data Model

Page 28: 0408 system 2 gooogle  Dewan Komisaris

Integrated HTTP StackPluggable ParserObject Mapping Add a Core Data Model

Keep in mind:Assign respective

classes to managed objects!

@interface GithubUser : NSObject

Page 29: 0408 system 2 gooogle  Dewan Komisaris

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: 0408 system 2 gooogle  Dewan Komisaris

Integrated HTTP StackPluggable ParserObject Mapping Adjust Object Mappings

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

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

Page 31: 0408 system 2 gooogle  Dewan Komisaris

Integrated HTTP StackPluggable ParserObject Mapping Adjust Object Creation

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

GithubIssue *issue = [GithubIssue object];

Page 32: 0408 system 2 gooogle  Dewan Komisaris

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: 0408 system 2 gooogle  Dewan Komisaris

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: 0408 system 2 gooogle  Dewan Komisaris

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: 0408 system 2 gooogle  Dewan Komisaris

Integrated HTTP StackPluggable ParserObject Mapping Putting it All Together

Page 36: 0408 system 2 gooogle  Dewan Komisaris

Thanks!

Page 37: 0408 system 2 gooogle  Dewan Komisaris

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