iOS网络编程学习笔记---1

运行循环

  1. iOS应用中的每个线程最多只有一个运行循环。可以没有,见第四条。
  2. 对于主线程,运行循环会自动开启,在应用委托的applicationDidFinishLaunchingWithOption:方法调用之后就可以访问了。
  3. 辅助线程必须显示的运行自己的运行循环。在辅助线程中开始运行循环之前,你至少要添加一个输入源或者定时器,否则运行循环就会立即退出。
  4. 线程的运行循环不是必须的。
  5. 运行循环会从两类源中接受事件:
    1. 输入源。输入源会异步向应用发送事件。
    2. 定时器。是同步发出的;会生成基于时间的通知,为应用(尤其是线程)提供了一种机制以在未来的每个时间执行某个具体任务。
  6. 运行循环也可以有观察者,它们不会被监控。这使得对象可以在运行循环执行过程中的某个活动发生时受到回调。(进入、退出运行循环;运行循环睡眠或唤醒;运行循环处理输入源或定时器)。观察者可以设置为触发一次也可以设置为触发多次。
  7. 运行循环模式是由操作系统所用的一种约定,用于过滤监控的源并发布时间,比如调用委托方法等。模式包含了应该监控的输入源和定时器,以及当运行循环时间发生时应该通知的观察者。
  8. iOS中有连个预定义的运行循环模式:NSDefaultRunLoopMode(kCFDefaultRunLoopMode),NSRunLoopCommonMode(kCFRunLoopCommonMode)。
  9. NSRunLoopCommonMode是可配置的。

门面模式

  1. 定义:为子系统中的一组接口提供一个统一接口。门面模式定义了一个更高层的接口,使子系统更加容易使用。
  2. 结构:
    • 门面角色:客户端可以调用这个角色的方法。此角色知道子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统中去。
    • 子系统角色:可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。每个子系统都可以被客户端直接调用,或者被门面角色调用。
  3. 适用性

    • 不需要使用一个复杂系统的所有功能,而且可以创建一个新的类,包含访问系统的所有规则。如果只需要使用系统的部分功能,那么你为新类所创建的API将比原系统的API简单的多。
    • 希望封装或者隐藏系统原系统。
    • 希望使用原系统的功能,而且还希望增加一些新的功能。
    • 编写新类的成本小于所有人学会使用或者未来维护原系统上所需的成本。

服务版本化

  1. 版本话服务系统的结构主要有两种方式:

    • 主动系统:远程门面会接受到客户端的当前版本,然后选择正确的端点。(由服务器负责选择哪个端点)
    • 被动系统:版本化服务端点是硬编码到客户端的每个新发布中。(由客户端负责选择哪个端点)
  2. 被动系统是实现服务版本化最简单的方式。

服务定位器

  1. 服务定位器是一个帮助应用动态探测远程源API端点的工具,它可以解决应用硬编码的无效或不再存在的端点问题。应用开发者还可以同过服务定位器将之前发布的应用重新指向可用的新服务。这些新服务无需改变与客户端的API契约。
  2. 服务定位器的核心知识一个包含了API端点与关于这些端点的一些简要元数据的文件。
  3. 推荐使用CDN来服务于服务定位器文件。
  4. 实现了服务定位器模式的任何客户端的第一个动作通常都是加载并解析文件。由于所有的网络调用都需要端点,而端点值位于该文件中,一次在任何其他的网络动作发生之前必须先解析该文件。
  5. 通常情况下,当服务定位器加载时,应用会显示启动画面。

HTTP

  1. berners-lee提案中有三个主要的创新:HTML、HTTP、URL。
    • HTTP定义了在服务端和客户端之间传输数据的一种方式。
    • HTML定义了向文本添加样式的一种方式。
    • URL定义了在网络机器中定位唯一资源的一种方式。
  2. 对于计算机通信老说,HTTP请求遵循着客户端-服务器范式。
  3. 早起的HTTP协议版本只允许在一个TCP连接上发送一个请求。HTTP 1.1则允许客户端重用连接。
  4. HTTP与HTTPS之间的最重要差别在于会话的连接建立阶段。在TCP连接建立好、HTTP请求发送前,客户端和服务器之间必须建立SSL会话。SSL会话建立包含多个阶段:客户端与服务器协商使用何种密码、交换公钥、验证协商以及验证身份(可选)。当SSL会话建立完毕后,在TCP连接之上传输的所有数据都将是加密的。
  5. URL(统一资源定位符)为Internet上的任何资源与内容提供了全局唯一的位置名。单个资源可以通过多个URL定位,但是单个URL不能引用不同的资源。在iOS的URL加载系统中,NSURL对象用于管理URL对象。
  6. 通常情况先,URL由5部分组成
    • 协议:指定了使用哪个应用层协议与服务器通信。除了HTTP,iOS中常用的另一个协议是FILE。FILE请求用于在应用沙箱中去的本地文件系统中的资源。如果使用字符串而没有使用协议创建NSURL对象,那么默认就会使用FILE协议。
    • 认证:用的不多,安全性比较低。
    • 主机名:URL的主机名部分制定了包含请求资源的主机的TCP主机名或IP地址。如果URL协议是FILE,那么这部分与端口部分必须省略掉。
    • 端口:指定了客户端连接的TCP端口。如果省略,那么客户端就会使用特定协议的默认端口:HTTP是80,HTTPS是443.
    • 绝对路径:指定了网络资源的路径。绝对路径可以包含任意数量的路径部分,每部分使用斜杠字符(/)分割。绝对路径不可以包含问号、空格、回车与换行。
    • 查询字符串;这个值与绝对路径部分是通过问号分隔的。根据约定,多个查询参数通过&字符分隔。查询字符串不可包含回车、空格和换行(可以使用?)
  7. 由于绝对路径和查询字符串的内容是受限的,因此URL通常会使用百分号进行编码。iOS为NSString对象提供了一个方法来执行URL的百分号编码。

    eg:NSString *urlString = @"http://myhost.com?query=This is a question";
    NSString *encode = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    
    上述代码的编码结果是http://myhost.com?query=This%20is%20a%20question。
    该编码不同于URL编码,因此不会改变URL参数的分隔。URL编码会编码&、问号与其他标点符号。
    
  8. HTTP请求包含3部分:请求行、请求头和请求体。请求行和请求体是文本行,通过回车/换页符分隔(值为13的字节,或是0x0D/值为10的字节,或是0x0A)。空行仅仅是将请求头和请求体划分开来。

  9. 一个HTTP请求示例:

    GET/index.html    HTTP/1.1(请求行)
    HOST(请求首部):www.gefionsoftware.com(附加消息)
    User-Agent:MoZilla/4.5 [en] (winNT:(I)
    Accept:image/gif,image/jpeg,image/pjpeg,image/png,*/*
    Accep-Langeuage:en
    Accept-Charset :iso-8859-1,*,UTF-8
    (……请求主体)
    
    • 请求行是发送给服务器的第一行数据。请求行包含3方面主要信息:HTTP请求方法、请求URI和HTTP版本。
      • 请求方法是个单词,标识了客户端请求的动作。(区分大小写)。常用的请求方法有:GET、POST、HEAD、PUT、DELETE。
        • GET:从服务器获取一段内容。GET请求通常不包含请求体,但是也是可以包含的。
        • POST:服务器使用客户端提供的数据更新实体(一段内容)。POST请求通常会在请求体中加入应用服务器所需的信息。处理多个请求,结果与处理单个请求是不同的。
      • 请求行的第二个域是URI,URI唯一标识求情的目标。如果请求使用的是GET方法,那么URI就会明确指定从目标主机检索的内容。URI还可以包含查询参数,查询参数不可以包含空格与回车换行符,每个查询参数用&隔开,不用包含协议啊、主机啊之类的东西,这些东西是在请求的Host头中提供的。
      • 请求行的最后一个域指定了所用HTTP的版本。
    • 紧跟请求行的是请求头,它向服务器提供额外的元数据。这些元数据可以描述客户端、进一步描述请求或是从服务器请求某种类型的响应。每个请求可以包含一个或多个头。HOST头是HTTP1.1请求中唯一必须提供的头。它提供了客户指定的原始主机名,还包含了最初请求的URL中的端口号。

    注意:虽然使用了有状态的TCP传输层,但HTTP却是个无状态协议。这意味着HTTP服务器并不会保留关于某个请求的任何信息以用在未来的请求中。cookie提供了一种方式,可以将一些简单的状态信息保存到客户端,并在后续的请求中与服务器进行通信。

    • HTTP请求头之后是可选的请求体。请求体可以是任意的字节序列,通过一个空行与头隔开来。请求体必须遵循客户端与服务器之间预先存在的数据编码。对于移动应用来说,通常是xml或者json数据。

    在iOS中,NSURLRequest及其子类NSMutableURLRequest提供了必要的方法和属性来构建几乎任何的HTTP请求。

  10. HTTP服务器与应用服务器处理完请求后,HTTP响应会通过同一个TCP socket返回给给客户端。HTTP响应的结构类似于HTTP请求,第一行也是状态行,后面是头,然后是响应体。
  11. 一个HTTP响应示例:

    HTTP/1.1  200 OK(状态行)
    Last-Modified(应答首部) : Mon,20 Dec 2001 23 :26 :42 GMT
    Date:Tue,11 Jan 2002 20:53:12 GMT
    Status:200
    Content-Type: Text/html
    Servlet-Engine:
    Content-Length:59
    
    <html>(应答主体)
    ……
    </html>
    
    • 状态行包含三个域,域之间用空格分隔。
      • 第一个域是响应的HTTP版本。
      • 接卸来的两个域提供了表示请求结果的状态值
        • 首先是一个三位数的整数值,包含了请求的结果代码。
        • 最后是条说明短语,提供了关于代码的简短文本说明。在大多数情况下,数值完全说明状态。
    • 紧跟状态行的是响应头,响应头之间通过回车/换行符进行分隔。每个头都包含了关于相应的元数据,包括数据上一次的修改时间、客户端可以缓存数据多长时间、数据的编码以及在随后的请求中提交的状态信息。
    • 响应体是通过空行与相应头分隔开的。响应体可以包含任意数量的二进制字符。与客户端通信的响应体的长度可以通过请求的Content—Length头或者通过块编码体现。

    iOS URL加载系统向应用隐藏了这种复杂性。在iOS的URL加载系统中,NSURLResponse及其子类NSHTTPURLResponse封装了请求返回的数据。该继承体系中有两个对象,因为URL加载可以基于非HTTP URL实现数据的请求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值