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]
时间: 2024-11-08 16:25:15

Big Nerd iOS Programming 第21章 Web service ,UIWebView的相关文章

Big Nerd iOS Programming 第20章 Dynamic Type 动态类型

Dynamic Type 动态类型 1.比如字体.使用动态的用户自定义的系统字体. -(void)updateFonts    {        UIFont *font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];        self.nameLabel.font = font;        self.dataLabel.font = font;    } 2.注册,获取修改通知    当用户修改了字体或者系统设置,会

iOS开发网络篇之Web Service和XML数据解析

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下载:http://dwz.cn/RwTjl 游戏视频预览:http://dwz.cn/RzHHd 游戏开发博客:http://dwz.cn/RzJzI 游戏源代码传送:http://dwz.cn/Nret1 在iPhone和后台系统的通信中,使用Web Service获取server数据上最常见的一

Web Service开发详解

第7章 Web Service开发详解 7.1 Web Service基本概念 7.2 Web Service的应用场景 7.3 创建简单的Web Service项目应用 7.4 Web Service属性介绍 7.5 ASP.NET如何调用Web Service 7.6.1 通过webbehavior.htc调用Web Se 7.6.2 通过Microsoft.XMLDOM调用Web S 7.6.3 XMLHTTP POST调用Web Service 7.6.4 SOAP调用Web Servi

iOS Programming The Big Nerd Ranch Guide (4th Edition)

Book Description Updated and expanded to cover iOS 7 and Xcode 5, iOS Programming: The Big Nerd Ranch Guide leads you through the essential concepts, tools, and techniques for developing iOS applications. After completing this book, you will have the

iOS 开发指南 第15章 访问Web Service之REST Web Service

***** 在电脑术语中,统一资源标识符(Uniform Resource Identifier,或URI)是一个用于标识某一互联网资源名称的字符串. 该种标识允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作.URI由包括确定语法和相关协议的方案所定义. Web上可用的每种资源 -HTML文档.图像.视频片段.程序等 - 由一个通用资源标识符(Uniform Resource Identifier, 简称"URI")进行定位. ***** 1 REST Web Ser

iOS 开发指南 第15章 访问Web Service之使用轻量级网络请求架构MKNetworkKIt

除苹果提供的NSURLConnection和NSURLRequest外第三方的网络框架 1 安装和配置MKNetworkKit框架 下载并打开MKNetworkKit目录添加MKNetworkKit文件夹到新工程中-添加支持的类库或框架 CFNetwork.framework SystemConfiguration.framework Security.framework-添加预编译头文件 #ifndef MyNotes/MyNotes-Prefix.pch #define MyNotes/My

iOS Programming UIWebView 2

iOS Programming? UIWebView 1 Instances of UIWebView render web content. UIWebView可以显示web content. In fact, the Safari application on your device uses a UIWebView to render its web content. 事实上,Safari application 用了一个UIWebView 显示它的web content. In this

iOS Programming View Controllers 视图控制器

iOS Programming View Controllers? 视图控制器? 1.1? A view controller is an instance of a subclass of UIViewController. 一个view controller 是一个UIViewController的子类. A view controller manages a view hierarchy. 一个view controller 管理一个视图树. It is responsible for c

iOS Programming UIStoryboard 故事板

iOS Programming UIStoryboard In this chapter, you will use a storyboard instead. Storyboards are a feature of iOS that allows you to instantiate and lay out all of your view controllers in one XIB-like file. Additionally, you can wire up view control