Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
Ways to build REST mobile client
Oursky Limited
June 27, 2013
Programming
1
110
Ways to build REST mobile client
Oursky Limited
June 27, 2013
Tweet
Share
More Decks by Oursky Limited
See All by Oursky Limited
oursky
1
400
oursky
1
230
oursky
0
230
oursky
0
130
oursky
0
110
oursky
0
190
oursky
3
260
oursky
0
110
oursky
1
270
Other Decks in Programming
See All in Programming
danilop
1
740
selcukusta
2
110
ianaya89
2
220
mizotake
2
320
makomakok
1
260
oracle4engineer
0
120
williln
0
230
grapecity_dev
0
190
kawaji_scratch
0
110
xrdnk
0
150
hanasuke
1
630
deepflow
9
3.5k
Featured
See All Featured
garrettdimon
288
110k
revolveconf
200
9.7k
shpigford
165
19k
maggiecrowley
10
500
caitiem20
308
17k
rasmusluckow
318
18k
jonyablonski
19
1.2k
phodgson
87
3.9k
sugarenia
233
860k
searls
204
36k
malarkey
119
16k
morganepeng
93
14k
Transcript
Ways to build REST mobile client Edwin Kwok Thursday, 27
June, 13
iOS Thursday, 27 June, 13
Network Manager Network Connection Builder / Factory Network Manager Delegate
Rugby Implementation Thursday, 27 June, 13
NetworkManager NetworkConnection NewsBuilder NewsViewController<NetworkManagerDelegate> Rugby Implementation 1. ask for News
6. News 2. send request 3. response 4. parse response 5. News Thursday, 27 June, 13
WeSnap Implementation ????? Thursday, 27 June, 13
RestKit Challenges Offline Data Access Flaky Connectivity Different Data Formats
Thursday, 27 June, 13
RestKit Features Integrated HTTP Stack Pluggable Parser Object Mapping Core
Data Integration UI Integration Thursday, 27 June, 13
Integrated HTTP Stack Base URLs Custom Header Network Indicator Performing
Requests Background Processing Authentication Request caching Thursday, 27 June, 13
Integrated HTTP Stack / / create client RKClient *client =
[RKClient clientWithBaseURL:@”http:/ /github.org”]; / / set header [client setValue:[[[UIDevice currentDevice] identifierForVendor] UUIDString] forHTTPHeaderField:@”X-UDID”]; / / set indicator behavior client.requestQueue.showsNetworkActivityIndicatorWhenBusy = YES; Thursday, 27 June, 13
Performing Request - (IBAction)forkYouWithBlocks { self.imageView.image = nil; [[RKClient sharedClient]
get:@"http:/ /github.com/fluidicon.png" usingBlock:^(RKRequest *request) { [request setBackgroundPolicy:RKRequestBackgroundPolicyContinue]; [request setOnDidLoadResponse:^(RKResponse *response) { if (response.isSuccessful) { UIImage *image = [UIImage imageWithData:response.body]; self.imageView.image = image; } }]; }]; } Thursday, 27 June, 13
Background Processing [request setBackgroundPolicy:RKRequestBackgroundPolicyContinue]; RKRequestBackgroundPolicyNone / / do nothing RKRequestBackgroundPolicyCancel
/ / cancel request RKRequestBackgroundPolicyContinue / / continue RKRequestBackgroundPolicyRequeue / / requeue upon app restart Thursday, 27 June, 13
Object Mapping Simple Object Mapping Mapping Relationships Inverse Mappings Serialization
Mappings Thursday, 27 June, 13
Object mapping { id: 1, name: “Peter”, location: “Hong Kong”,
followers: 1, email: “test@example.com”, following: 36 } @interface User : NSObject @property (strong, nonatomic) NSNumber *id; @property (strong, nonatomic) NSString *name; @property (strong, nonatomic) NSString *location; @property (strong, nonatomic) NSNumber *followers; @property (strong, nonatomic) NSString *email; @property (strong, nonatomic) NSNumber *following; @end Thursday, 27 June, 13
Object mapping / / register mapping for a class objectMapping
= [RKObjectMapping mappingForClass:[User class]]; [objectMapping mapKeyPath:@"id" toAttribute:@"id"]; [objectMapping mapKeyPath:@"name" toAttribute:@"name"]; [objectMapping mapKeyPath:@"location" toAttribute:@"location"]; [objectMapping mapKeyPath:@"email" toAttribute:@"email"]; [objectMapping mapKeyPath:@"following" toAttribute:@"following"]; [objectMapping mapKeyPath:@"followers" toAttribute:@"followers"]; Thursday, 27 June, 13
Object mapping [[RKObjectManager sharedManager] loadObjectsAtResourcePath:[NSString stringWithFormat:@"/users/%@", userName] usingBlock:^(RKObjectLoader *loader) {
[SVProgressHUD showWithStatus:@"Loading..."]; [loader setObjectMapping:objectMapping]; [loader setOnDidLoadObject:^(id object) { [SVProgressHUD dismiss]; }]; [loader setOnDidFailWithError:^(NSError *error) { [SVProgressHUD showErrorWithStatus:@"Problem loading user"]; }]; }]; Thursday, 27 June, 13
Mapping Relationship RKObjectMapping *userMapping = [RKObjectMapping mappingForClass:[User class]]; RKObjectMapping *issueMapping
= [RKObjectMapping mappingForClass:[Issue class]]; / / create relationships [issueMapping mapKeyPath:@"user" toRelationship:@"user" withMapping:userMapping]; { number: 1, title: “Issue #1”, user: { ... } } @interface Issue : NSObject @property (strong, nonatomic) NSNumber *number; @property (strong, nonatomic) NSString *title; @property (strong, nonatomic) User *user; @end Thursday, 27 June, 13
Android Thursday, 27 June, 13
Thursday, 27 June, 13
Problem The operating system may shut down the process Solution:
use service Thursday, 27 June, 13
Use a Service API Thursday, 27 June, 13
Use ContentProvider API Thursday, 27 June, 13
Google I/0 2013 Volley: Easy, Fast Networking for Android Thursday,
27 June, 13
Why Volley Restful apps have common features: infinite scroll image
loading offline caching request priority Volley provides all of them Thursday, 27 June, 13
Reference http:/ /www.amazon.com/Test-Driven-iOS- Development-Developers-Library/dp/ 0321774183 http:/ /restkit.org/ https:/ /dl.google.com/googleio/2010/android- developing-RESTful-android-apps.pdf
http:/ /www.youtube.com/watch? v=yhv8l9F44qo Thursday, 27 June, 13