Big Nerd iOS Programming 第21章 Web service ,UIWebView
1. 两部分: 链接并获取数据 从获取到数据构建数据模型 2.通过HTTP协议于web服务器通信 `浏览器发送一个请求给制定的url地址,url返回求情页。HTML以及图片 `浏览器发生带有其他参数的比如是表数据 给制定的服务器,服务器返回一个自定义的或者动态的活着web page 3.数据格式一般是JSON或者XML 4.请求的url格式。 一般没有特定的格式,只要服务器能识别即可。比如灰腾腾p://bookapi.bignerdranch.com/course.json http://baseURL.com/serviceName?argumentX=valueX&argumentY=valueY 比如获取指定时间的课程内容: http://bignerdranch.com/course?year=2014&month=11 !!!url地址不能包好空格等一些特殊字符,如果有需要,你要进行转义 NSString *search = @"Play some \"Abba\""; NSString *escaped = [search stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 解析地址 - (NSString *)stringByRemovingPercentEncoding; 5.使用URLSession NSURLSession *session; NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionCofiguration]; session = [NSURLSession sessionWithConfiguration:config delegate:nil delegateQueue:nil]; 创建带一个configuration以及delegate,delegateQueue 默认可以为nil 获取数据: -(void)fetchFeed { NSString *requestString = @"http://bignerdranch.com/course.json"; NSURL *url = [NSURL URLWithString:requestString]; NSURLRequest *req = [NSURLRequest requestWithURL:url]; NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:req completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){ NSString *json = [[NSString alloc] stringWithData: data encoding:NSUTF8StringEncoding]; }]; [dataTask resume]; } 使用session创建dataTask 6.JSON数据 解析:使用自带原生类NSJSONSerialization,会把对应的数据转换为NS类型的,NSDictionary,NSArray,NSString,NSNumber... ^(NSData *data,NSURLResponse *response,NSError *error) { NSDictionary *jsonObject = [NSJSONSerialization jsonObjectWithData:data tions:0 ror:nil]; } // 修改tableViewController - (void)viewDidLoad { [super viewDidLoad]; [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"UITableViewCell"]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 0; return [self.courses count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { return nil; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell" forIndexPath:indexPath]; NSDictionary *course = self.courses[indexPath.row]; cell.textLabel.text = course[@"title"]; return cell; } 7.主线程 Main Thread 现代苹果设备有多个处理器,所以可以存在多个代码段并发执行。 主线程有时候也叫UI线程,与处理UI相关的都要放在主线程中。 然而像上面那种做法默认将NSURLSessionDataTask就放在其他线程中处理 background thread, ****对比与上面做法的差异**** 加载完后reloadData,与UI相关,如何放到主线程中运行: dispatch_async函数 ^(NSData *data,NSURLResponse *response,NSError *error) { NSDictionary *jsonObject = [NSJSONSerialization jsonObjectWithData:data tions:0 ror:nil]; dispatch_async(dispatch_get_main_queue(),^{ [self.tableView reloadData]; }) } -------------------------------------------------------- 8.UIWebView 之前的每个单元格数据保留了一个具体的url,点击单元格能显示url的内容,但不需要离开应用去打开safari // UIWebView 作为v存在一个viewController(c)中 @interface BNRWebViewController : UIViewController @property (nonatomic) NSUR *URL; @end @implementation BNRWebViewController -(void)loadView { UIWebView *webView = [[UIWebView alloc] init]; webView.scalePageToFit = YES; self.view = webView; } -(void)setURL:(NSURL *)URL { _URL = URL; if(_URL){ NSURLRequest *req = [NSURLRequest requestWithURL:_URL]; [(UIWenView *)self.view loadRequest:req]; } } @end ////// 在BNRCourseViewController.h中定义新属性: @class BNRWebViewController; // 如果只是声明,引入类即可 @property (nonatomic) BNRWebViewController *webViewController; @end ////// 在delegation 中 -(BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)options { //.....code. BNRWebViewController *wvc = [[BNRWebViewController alloc] init]; cvc.webViewController = wvc; } ////// @implementation BNRCourseViewController -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSDictionary *course = self.courses[indexPath.row]; NSURL *url = [NSURL URLWithString:course[@"url"]]; self.webViewController.title = course[@"title"]; self.webViewController.URL = url; [self.navigationController pushViewController:self.webViewController animated:YES]; } 9.证书 credentials 当你访问一些网站,需要授权或者是身份认证等,就不能直接获取数据,还需要中间提供验证 //需要用户名和密码 -(void)fetchFeed { NNString *requestString = @"https://bookapi.bignerranch.com/private/courses.json"; //code... } -(instancetype) initWithStyle:(UITableViewStype)style { //code ... { //code ... _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil]; [self fetchFeed]; } return self; } ////// @implementation BNRCoursesViewController() <NSURLSessionDataDelegate> // delegation method -(void)URLSession:(NSURLSession *) session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition,NSURLCredential *)) completionHandler { NSURLCredential *cred = [NSURLCredential credentialWithUser:@"BigNerdRanch" password:@"AchieveNerdvana" persistence:NSURLCredentialPersistenceForSession completionHandler(NSURLSessionAuthChallengeUseCredential,cred)]; } @end 10.UIWebView 会记录浏览历史,可以使用添加UIToolbar前进后退[goBack,goForward]
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。