Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

iOS for ERREST - alternative version

735 views

Published on

Published in: Technology, Education
  • Be the first to comment

  • Be the first to like this

iOS for ERREST - alternative version

  1. 1. iOS REST ClientPaul Lynch@pauldlynch, paul@plsys.co.uk
  2. 2. • Architecture of iOS apps• Comet Architecture• Model Implementation• Controller Implementation• Other iOS ConceptsiOS REST Client
  3. 3. Architecture of iOS apps• MVC - Model/View/Controller• Objective C• Foundation• UIKit - UIApplication, UIViewController, UIView, UIControl
  4. 4. Foundation• NSArray, NSDictionary, NSSet• NSValue• NSPredicate
  5. 5. UIKit - UIApplication• UIApplication• status bar• window• orientation• AppDelegateapplicationDidFinishLaunchingWithOptions:notifications - UIApplicationWillEnterForegroundNotification,UIApplicationDidEnterBackgroundNotification
  6. 6. UIView• animations• gestures
  7. 7. View Controllers• - (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle• navigationController, tabBarController• rotation, transitions• subclasses - e.g. UITableViewController
  8. 8. TableViews• UITableViewController• UITableView• data source• delegate• UITableViewCell
  9. 9. Table view data source@protocol UITableViewDataSource<NSObject>- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;...@end@interface NSIndexPath (UITableView)+ (NSIndexPath *)indexPathForRow:(NSInteger)row inSection:(NSInteger)section;@property(nonatomic,readonly) NSInteger section;@property(nonatomic,readonly) NSInteger row;@end
  10. 10. Table view delegate@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate>...- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath;...- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;...@end
  11. 11. Comet Architecture
  12. 12. Comet ArchitectureMarketingdbReviewsWO dbXMLLinux, mySQLChangeReportMobileclients
  13. 13. Comet DatabaseFeatures: skunum, runId; xml/json held as stringsCategorySKUReview WC7SKUClient
  14. 14. REST API• category - parent, children• sku• skudetail - contains full review and XML text• brand - attribute of sku
  15. 15. ERREST Routes routeRequestHandler.addRoute(new ERXRoute(Sku.ENTITY_NAME, "/sku", ERXRoute.Method.Options, SkuController.class,"options")); routeRequestHandler.addRoute(new ERXRoute(Sku.ENTITY_NAME, "/sku", ERXRoute.Method.Head, SkuController.class, "head")); routeRequestHandler.addRoute(new ERXRoute(Sku.ENTITY_NAME, "/sku", ERXRoute.Method.All, SkuController.class, "index")); // MS: this only works with numeric ids routeRequestHandler.addRoute(new ERXRoute(Sku.ENTITY_NAME, "/sku/{action:identifier}", ERXRoute.Method.Get, SkuController.class)); routeRequestHandler.addRoute(new ERXRoute(Sku.ENTITY_NAME, "/sku/{sku:Sku}", ERXRoute.Method.Get, SkuController.class, "show")); routeRequestHandler.addRoute(new ERXRoute(Sku.ENTITY_NAME, "/sku/{sku:Sku}/{action:identifier}", ERXRoute.Method.All,SkuController.class));plus Category, Brand, Skudetail
  16. 16. Model Implementation• PLRestful• CometAPI• Sku (etc)
  17. 17. PLRestfultypedef void (^PLRestfulAPICompletionBlock)(PLRestful *api, id object, NSInteger status, NSError *error);@interface PLRestful : NSObject@property (nonatomic, copy) NSString *endpoint;@property (nonatomic, copy) PLRestfulAPICompletionBlock completionBlock;@property (nonatomic, copy) NSString *username;@property (nonatomic, copy) NSString *password;@property (nonatomic, assign) BOOL useBasicAuthentication;+ (NSString *)messageForStatus:(NSInteger)status;+ (BOOL)checkReachability:(NSURL *)url;+ (void)get:(NSString *)requestPath parameters:(NSDictionary *)parameters completionBlock:(PLRestfulAPICompletionBlock)completion;+ (void)post:(NSString *)requestPath content:(NSDictionary *)content completionBlock:(PLRestfulAPICompletionBlock)completion;- (void)get:(NSString *)requestPath parameters:(NSDictionary *)parameters completionBlock:(PLRestfulAPICompletionBlock)completion;- (void)post:(NSString *)requestPath content:(NSDictionary *)content completionBlock:(PLRestfulAPICompletionBlock)completion;@end
  18. 18. PLRestful - get- (void)get:(NSString *)requestString parameters:(NSDictionary *)parameters completionBlock:(PLRestfulAPICompletionBlock)completion {NSURL *requestURL = [[NSURL URLWithString:endpoint] urlByAddingPath:requestString parameters:parameters];NSLog(@"get: %@", [requestURL absoluteString]);NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:requestURL];[request setHTTPMethod:@"GET"];[self handleRequest:request completion:(PLRestfulAPICompletionBlock)completion];}
  19. 19. PLRestful - post- (void)post:(NSString *)requestString content:(NSDictionary *)content completionBlock:(PLRestfulAPICompletionBlock)completion {NSURL *requestURL = [[NSURL URLWithString:endpoint] urlByAddingPath:requestString parameters:nil];NSLog(@"post: %@", [requestURL absoluteString]);NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:requestURL];[request setHTTPMethod:@"POST"];NSError *error = nil;request.HTTPBody = [NSJSONSerialization dataWithJSONObject:content options:0 error:&error];if (error) {NSLog(@"json generation failed: %@", error);[self callCompletionBlockWithObject:nil status:0 error:[NSError errorWithDomain:@"com.plsys.semaphore.CometAPI" code:1003 userInfo:nil]];return;}[self handleRequest:request completion:completion];}
  20. 20. Controller Implementation• SkuController• subclass of UITableViewController
  21. 21. SkuController - data source- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {return 1;}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {return [skus count];}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {NSDictionary *sku = [skus objectAtIndex:indexPath.row];static NSString *CellIdentifier = @"SkuCell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];if (cell == nil) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;}// Configure the cell...cell.textLabel.text = [[sku valueForKey:@"productName"] pl_stringByStrippingHTML];cell.detailTextLabel.text = [sku valueForKey:@"skuNum"];id image = [images objectAtIndex:indexPath.row];if ([image isKindOfClass:[UIImage class]]) {cell.imageView.image = image;}return cell;}
  22. 22. SkuController - tv delegate- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {NSDictionary *sku = [skus objectAtIndex:indexPath.row];NSString *skuNum = [[sku valueForKey:@"skuNum"] copy];NSLog(@"tapped: %@", skuNum);SkuDetail *view = [[SkuDetail alloc] initWithStyle:UITableViewStylePlain];view.sku = sku;view.image = [images objectAtIndex:indexPath.row];[self.navigationController pushViewController:view animated:YES];}- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{[self tableView:tableView accessoryButtonTappedForRowWithIndexPath:indexPath];}- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {if (indexPath.row == ((batch + 1)*25)-1) {// time to fetch moreself.batch = ++batch;NSMutableDictionary *batchParameters = [parameters mutableCopy];if (!batchParameters) batchParameters = [NSMutableDictionary dictionary];[batchParameters setObject:[NSNumber numberWithInt:batch] forKey:@"batch"];NSLog(@"batchParameters %@", batchParameters);[CometAPI get:query parameters:batchParameters completionBlock:^(PLRestful *api, id object, NSInteger status, NSError *error) {if (error) [self handleError:error];else {[self didAddSkus:object];}}];}}
  23. 23. Other iOS Topics• Human Interface Guidelines• Buttons - 44x44• Gestures• Controllers - mail, movie, picker• Other UIControls - switch, slider, page control• iOS 7
  24. 24. Code Example• SOE Status• http://github.com/pauldlynch/SOEStatus• older version, will update soon
  25. 25. Q&APaul Lynchpaul@plsys.co.uk@pauldlynch

×