zoukankan      html  css  js  c++  java
  • ios之NSURLRequest&NSURLConnection

    网络编程中一般都是经过  请求---》连接---》响应   (request  --》  connection  --》  response)这个过程。

    一般的步骤是这样的:

    1、先创建一个NSURL。

    2、通过这个指定的URL创建NSURLRequest,这里还可以指定缓存策略和超时时间。

    3、根据你的request创建NSURLConnection,并对你的connection进行响应(同步、异步)。

    下面详细解说这个过程

    1、创建URL

    1. NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];  

    2、创建NSURLRequest

     

     

    1. NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];  

    解释一下其中的初始化参数:initWithURL:这里指定要访问的url;cachePolicy:这里是指定缓存策略(包括6种);timeoutInterval:指定超时时间

     

    缓存策略:

     

    1. NSURLRequestCachePolicy  
    2. These constants are used to specify interaction with the cached responses.  
    3. enum  
    4. {  
    5.    NSURLRequestUseProtocolCachePolicy = 0,  
    6.    NSURLRequestReloadIgnoringLocalCacheData = 1,  
    7.    NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4,  
    8.    NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,  
    9.    NSURLRequestReturnCacheDataElseLoad = 2,  
    10.    NSURLRequestReturnCacheDataDontLoad = 3,  
    11.    NSURLRequestReloadRevalidatingCacheData = 5  
    12. };  
    13. typedef NSUInteger NSURLRequestCachePolicy;  

    稍微解释一下:

     

     

     NSURLRequestUseProtocolCachePolicy(基础策略)这个是NSURLRequest的默认策略

     NSURLRequestReloadIgnoringLocalCacheData(忽略本地缓存)

     NSURLRequestReturnCacheDataElseLoad(首先使用缓存,如果没有本地缓存,才从原地址下载)

     NSURLRequestReturnCacheDataDontLoad(使用本地缓存,从不下载,如果本地没有缓存,则请求失败,此策略多用于离线操作)

     NSURLRequestReloadIgnoringLocalAndRemoteCacheData(无视任何缓存策略,无论是本地的还是远程的,总是从原地址重新下载)

     NSURLRequestReloadRevalidatingCacheData(如果本地缓存是有效的则不下载,其他任何情况都从原地址重新下载)

    具体的请参看这一篇博客:http://blog.csdn.net/zeng11088/article/details/8544759( 

    NSURLRequest的官方文档的译文

     

     

    3、创建NSURLConnection &  响应

    首先,上面讲到网络编程有同步和异步两种连接方式,连接采用同步响应是通过使用sendSynchronousRequest方法实现的,而连接采用异步响应是通过代理NSURLConnectionDelegate的方法实现的
    (1)同步连接响应:使用这个方法。

    1. + (NSData *)sendSynchronousRequest:(NSURLRequest *)request  returningResponse:(NSURLResponse **)response  error:(NSError **)error     

    例如

    1. NSData *received = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];  

    (2)异步连接响应:代理实现

     

    创建一个connection之后调用以下相关的代理方法

     

    1. NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:request delegate:self];   

     

    ①Sent when the connection has received sufficient data to construct the URL response for its request.

     

    1. - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response  

    ②Sent as a connection loads data incrementally.

     

     

    1. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data  

    ③Sent when a connection has finished loading successfully

    1. - (void)connectionDidFinishLoading:(NSURLConnection *)connection  

    ④Sent when a connection fails to load its request successfully.

     

     

    1. - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error  

    稍微解释一下这个过程:如果connection收到response,就调用delegate中的第①个方法didReceiveResponse方法,这里需要创建一个data缓冲区,这个是第一步。然后一点点接收数据,不断追加到先前创建的data,这个过程会重复调用didReceiveData方法,这个是第二步。如果接受完成,会调用connectionDidFinishLoading这个方法,表示数据全部接收完毕;如果接收数据出现错误或者异常,则会调用didFailWithError这个方法结束,这是第三步。

     

    附:如果网络请求进行了一半时退出程序,大家都知道这时候程序会被挂起,那么网络连接怎么办呢?实际上当程序退出时,系统并不会立即挂起应用进程,而是会延迟大概一秒,如果这样请求还是没有完成,系统底层会默默地帮你把数据都接收完,帮你保存请求超时时间那么久。比如你设置超时时间30s,30s内重新打开应用,数据就立刻全都一次性收到,如果没打开,不好意思,下次打开程序时,delegate的didFailWithError方法会被调用,通知你请求超时了。

  • 相关阅读:
    Xcode8 去除系统日志输出
    SVN参考命令
    Xcode模拟网络状态
    iOS 图片拉伸
    iOS进阶
    label中添加图片
    Cookie的格式及组成
    java数据类型总结
    Hibernate一级缓存与二级缓存的区别
    mysql连接jdbc查询代码
  • 原文地址:https://www.cnblogs.com/yulang314/p/3550450.html
Copyright © 2011-2022 走看看