iT邦幫忙

0

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秒的時間,太長了。你覺得合適的時間是幾秒呢?歡迎在下面留言給我。


尚未有邦友留言

立即登入留言