iOS APP 开发 OC 第十五天,网路请求(请求方式对比,缓存策略,请求时长)

tags: OC 30 day


获取网路数据的两种方式:

方式一:NSData

  • 方法: 获取JSON,修改服务器内的JSON,重新下载。制作一个API接口
  • 缺点: 无法放置缓存策略,超时时长,请求
    我们来复习一下如何使用NSData获取数据。
  //第一种方式 获取网路数据
   NSURL *url = [NSURL URLWithString:@"https://run.mocky.io/v3/39057ccc-3332-4a2f-a88f-7bd259f078b0"];
   NSData *data = [NSData dataWithContentsOfURL:url];
   NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
   NSLog(@"%@",str);

方式二:NSURLConnection

  • 特点: 可以异步发送请求,可以通过NSMutableRequest设置缓存策略,超时时长,header。
   //第二种方式 获取网路数据
    NSURL *url = [NSURL URLWithString:urlStr];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
            NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"%@",str);
    }];

有两种方式,有哪一种好呢?

第二种方式好

因为第一种方式,很多事情不能做,哪些事情呢?
第一种方式,没办法设置header,也有很多种请求资讯无法操作。

如何利用第二种方式请求header?

    NSMutableURLRequest *request = [NSURLRequest requestWithURL:url];
    
    //设置请求头
    [request setValue:你要设置的value forHTTPHeaderField: 你要设置的键];

如何设置缓存策略

配置参数时,可以看到三个参数设定,如下

  1. URL
  2. 缓存策略
  3. 时长
    NSMutableURLRequest *request = [NSMutableURLRequest 
    requestWithURL:<#(nonnull NSURL *)#> 
    cachePolicy:<#(NSURLRequestCachePolicy)#> 
    timeoutInterval:<#(NSTimeInterval)#>];

缓存策略有哪几种?

我们来看看NSURLRequestCachePolicy是如何被定义的
NSURLRequestCachePolicy因为有好几种,所以他是一个枚举。

typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy)
{
    NSURLRequestUseProtocolCachePolicy = 0,
    NSURLRequestReloadIgnoringLocalCacheData = 1,
    NSURLRequestReturnCacheDataElseLoad = 2,
    NSURLRequestReturnCacheDataDontLoad = 3,
};

http协议的缓存策略 0

NSURLRequestUseProtocolCachePolicy

忽略本地缓存 加载最新数据 1

NSURLRequestReloadIgnoringLocalCacheData

如果有缓存,返回缓存数据,否则重新下载 2

NSURLRequestReturnCacheDataElseLoad

返回缓存数据,没有缓存也不下载网路数据 3

NSURLRequestReturnCacheDataDontLoad

永远不打API,主要用在离线运用。

默认情况下,我们选择0的缓存策略。
以下是范例的程序码。

    NSURL *url = [NSURL URLWithString:urlStr];
    NSMutableURLRequest *request = [NSMutableURLRequest 
    requestWithURL:url 
    cachePolicy:0 
    timeoutInterval:15];

那麽如果不客制请求,请求是什麽型态呢?

我们来查看下面这个网路请求的定义。

    NSMutableURLRequest *request = [NSURLRequest requestWithURL:url];

可以看到下面这段网路请求的注解

/*! 
    @method requestWithURL:
    @abstract Allocates and initializes an NSURLRequest with the given
    URL.
    @discussion Default values are used for cache policy
    (NSURLRequestUseProtocolCachePolicy) and timeout interval (60
    seconds).
    @param URL The URL for the request.
    @result A newly-created and autoreleased NSURLRequest instance.
*/

在这段注解里,你会发现几个问题:

超时时长60秒,合适吗?

不合适,让使用者等待60秒的时间,太长了。你觉得合适的时间是几秒呢?欢迎在下面留言给我。


<<:  [C#] LeetCode 5. Longest Palindromic Substring

>>:  iOS APP 开发 OC 第十五天,网路请求(错误处理)

[Angular] Day17. Dynamic component loader

介绍完什麽是 template 与 structuarl directive 後,接着回来介绍 co...

[Day13] CH08:积沙成塔——Array & ArrayList(下)

还记得前两天我们在介绍阵列的时候,有说到需要给他固定的长度,若超过就需要宣告一个新的更大的阵列吗?那...

企划实现(29)

使用自定义的listview 第四部:创建listview的adapter package com....

iOS App开发 OC 第一天, @interface设计思维

从Swift 到 OC 第一天, @interface设计思维 tags: OC 30 day 第一...

[Python 爬虫这样学,一定是大拇指拉!] DAY28 - 实战演练:集大成 - 自动更新每日个股日成交资讯

自动更新每日个股日成交资讯 结合前几篇所学,我们来做一个可以自动更新日成交资讯的程序吧! Reque...