程序員最愛造輪子系列之網(wǎng)絡(luò)請求(一)

1.NSURLConnection使用
1.1 NSURLConnection同步請求(GET)

(1)步驟

    01 設(shè)置請求路徑
    02 創(chuàng)建請求對象(默認(rèn)是GET請求,且已經(jīng)默認(rèn)包含了請求頭)
    03 使用NSURLSession sendsync方法發(fā)送網(wǎng)絡(luò)請求
    04 接收到服務(wù)器的響應(yīng)后,解析響應(yīng)體

(2)相關(guān)代碼

//1.確定請求路徑
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=XML"];
//    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"];

    //2.創(chuàng)建一個請求對象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    //3.把請求發(fā)送給服務(wù)器
    //sendSynchronousRequest  阻塞式的方法,會卡住線程

    NSHTTPURLResponse *response = nil;
    NSError *error = nil;

    /*
     第一個參數(shù):請求對象
     第二個參數(shù):響應(yīng)頭信息,當(dāng)該方法執(zhí)行完畢之后,該參數(shù)被賦值
     第三個參數(shù):錯誤信息,如果請求失敗,則error有值
     */
     //該方法是阻塞式的,會卡住線程
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    //4.解析服務(wù)器返回的數(shù)據(jù)
    NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

1.2 NSURLConnection異步請求(GET-SendAsync)

(1)相關(guān)說明

01 該方法不會卡住當(dāng)前線程,網(wǎng)絡(luò)請求任務(wù)是異步執(zhí)行的

(2)相關(guān)代碼

//1.確定請求路徑
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it"];

    //2.創(chuàng)建一個請求對象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    //3.把請求發(fā)送給服務(wù)器,發(fā)送一個異步請求
    /*
     第一個參數(shù):請求對象
     第二個參數(shù):回調(diào)方法在哪個線程中執(zhí)行,如果是主隊(duì)列則block在主線程中執(zhí)行,非主隊(duì)列則在子線程中執(zhí)行
     第三個參數(shù):completionHandlerBlock塊:接受到響應(yīng)的時(shí)候執(zhí)行該block中的代碼
        response:響應(yīng)頭信息
        data:響應(yīng)體
        connectionError:錯誤信息,如果請求失敗,那么該參數(shù)有值
     */
    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * __nullable response, NSData * __nullable data, NSError * __nullable connectionError) {

        //4.解析服務(wù)器返回的數(shù)據(jù)
        NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
        //轉(zhuǎn)換并打印響應(yīng)頭信息
        NSHTTPURLResponse *r = (NSHTTPURLResponse *)response;
        NSLog(@"--%zd---%@--",r.statusCode,r.allHeaderFields);
    }];

1.3 NSURLConnection異步請求(GET-代理)

(1)步驟

01 確定請求路徑
02 創(chuàng)建請求對象
03 創(chuàng)建NSURLConnection對象并設(shè)置代理
04 遵守NSURLConnectionDataDelegate協(xié)議,并實(shí)現(xiàn)相應(yīng)的代理方法
05 在代理方法中監(jiān)聽網(wǎng)絡(luò)請求的響應(yīng)

(2)設(shè)置代理的幾種方法

/*
     設(shè)置代理的第一種方式:自動發(fā)送網(wǎng)絡(luò)請求
     [[NSURLConnection alloc]initWithRequest:request delegate:self];
     */

    /*
     設(shè)置代理的第二種方式:
     第一個參數(shù):請求對象
     第二個參數(shù):誰成為NSURLConnetion對象的代理
     第三個參數(shù):是否馬上發(fā)送網(wǎng)絡(luò)請求,如果該值為YES則立刻發(fā)送,如果為NO則不會發(fā)送網(wǎng)路請求
     NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];

     //調(diào)用該方法控制網(wǎng)絡(luò)請求的發(fā)送
     [conn start];
     */

    //設(shè)置代理的第三種方式:使用類方法設(shè)置代理,會自動發(fā)送網(wǎng)絡(luò)請求
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
    //取消網(wǎng)絡(luò)請求
    //[conn cancel];

(3)相關(guān)的代理方法

/*
 1.當(dāng)接收到服務(wù)器響應(yīng)的時(shí)候調(diào)用
 第一個參數(shù)connection:監(jiān)聽的是哪個NSURLConnection對象
 第二個參數(shù)response:接收到的服務(wù)器返回的響應(yīng)頭信息
 */
- (void)connection:(nonnull NSURLConnection *)connection didReceiveResponse:(nonnull NSURLResponse *)response

/*
 2.當(dāng)接收到數(shù)據(jù)的時(shí)候調(diào)用,該方法會被調(diào)用多次
 第一個參數(shù)connection:監(jiān)聽的是哪個NSURLConnection對象
 第二個參數(shù)data:本次接收到的服務(wù)端返回的二進(jìn)制數(shù)據(jù)(可能是片段)
 */
- (void)connection:(nonnull NSURLConnection *)connection didReceiveData:(nonnull NSData *)data
/*

 3.當(dāng)服務(wù)端返回的數(shù)據(jù)接收完畢之后會調(diào)用
 通常在該方法中解析服務(wù)器返回的數(shù)據(jù)
 */
-(void)connectionDidFinishLoading:(nonnull NSURLConnection *)connection

/*4.當(dāng)請求錯誤的時(shí)候調(diào)用(比如請求超時(shí))
 第一個參數(shù)connection:NSURLConnection對象
 第二個參數(shù):網(wǎng)絡(luò)請求的錯誤信息,如果請求失敗,則error有值
 */
- (void)connection:(nonnull NSURLConnection *)connection didFailWithError:(nonnull NSError *)error

(4)其它知識點(diǎn)

    01 關(guān)于消息彈窗第三方框架的使用
        SVProgressHUD
    02 字符串截取相關(guān)方法
    - (NSRange)rangeOfString:(NSString *)searchString;
    - (NSString *)substringWithRange:(NSRange)range;

1.4 NSURLConnection發(fā)送POST請求

(1)發(fā)送POST請求步驟

a.確定URL路徑
b.創(chuàng)建請求對象(可變對象)
c.修改請求對象的方法為POST,設(shè)置請求體(Data)
d.發(fā)送一個異步請求
e.補(bǔ)充:設(shè)置請求超時(shí),處理錯誤信息,設(shè)置請求頭(如獲取客戶端的版本等等,請求頭是可設(shè)置可不設(shè)置的)

(2)相關(guān)代碼

 //1.確定請求路徑
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"];

    //2.創(chuàng)建請求對象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    //2.1更改請求方法
    request.HTTPMethod = @"POST";

    //2.2設(shè)置請求體
    request.HTTPBody = [@"username=520it&pwd=520it" dataUsingEncoding:NSUTF8StringEncoding];

    //2.3請求超時(shí)
    request.timeoutInterval = 5;

    //2.4設(shè)置請求頭
    [request setValue:@"ios 9.0" forHTTPHeaderField:@"User-Agent"];

    //3.發(fā)送請求
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * __nullable response, NSData * __nullable data, NSError * __nullable connectionError) {

        //4.解析服務(wù)器返回的數(shù)據(jù)
        if (connectionError) {
            NSLog(@"--請求失敗-");
        }else
        {
            NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
        }

    }];

1.5 URL中文轉(zhuǎn)碼問題 //1.確定請求路徑

  NSString *urlStr = @"http://120.25.226.186:32812/login2?username=小碼哥&pwd=520it";
  NSLog(@"%@",urlStr);
  //中文轉(zhuǎn)碼操作
  urlStr =  [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  NSLog(@"%@",urlStr);

  NSURL *url = [NSURL URLWithString:urlStr];

2.0 JSON解析
2.1 JSON簡單介紹
001 問:什么是JSON 答:

  (1)JSON是一種輕量級的數(shù)據(jù)格式,一般用于數(shù)據(jù)交互
  (2)服務(wù)器返回給客戶端的數(shù)據(jù),一般都是JSON格式或者XML格式(文件下載除外)

002 相關(guān)說明

  (1)JSON的格式很像OC中的字典和數(shù)組
  (2)標(biāo)準(zhǔn)JSON格式key必須是雙引號

003 JSON解析方案

  a.第三方框架  JSONKit\SBJSON\TouchJSON
  b.蘋果原生(NSJSONSerialization)

2.2 JSON解析相關(guān)代碼

(1)json數(shù)據(jù)->OC對象

//把json數(shù)據(jù)轉(zhuǎn)換為OC對象
-(void)jsonToOC
{
    //1. 確定url路徑
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=33&pwd=33&type=JSON"];

    //2.創(chuàng)建一個請求對象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    //3.使用NSURLSession發(fā)送一個異步請求
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {

        //4.當(dāng)接收到服務(wù)器響應(yīng)的數(shù)據(jù)后,解析數(shù)據(jù)(JSON--->OC)

        /*
         第一個參數(shù):要解析的JSON數(shù)據(jù),是NSData類型也就是二進(jìn)制數(shù)據(jù)
         第二個參數(shù): 解析JSON的可選配置參數(shù)
         NSJSONReadingMutableContainers 解析出來的字典和數(shù)組是可變的
         NSJSONReadingMutableLeaves 解析出來的對象中的字符串是可變的  iOS7以后有問題
         NSJSONReadingAllowFragments 被解析的JSON數(shù)據(jù)如果既不是字典也不是數(shù)組, 那么就必須使用這個
         */
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
        NSLog(@"%@",dict);

    }];
}

(2)OC對象->JSON對象

 //1.要轉(zhuǎn)換成JSON數(shù)據(jù)的OC對象*這里是一個字典
    NSDictionary *dictM = @{
                            @"name":@"wendingding",
                            @"age":@100,
                            @"height":@1.72
                            };
    //2.OC->JSON
    /*
     注意:可以通過+ (BOOL)isValidJSONObject:(id)obj;方法判斷當(dāng)前OC對象能否轉(zhuǎn)換為JSON數(shù)據(jù)
     具體限制:
         1.obj 是NSArray 或 NSDictionay 以及他們派生出來的子類
         2.obj 包含的所有對象是NSString,NSNumber,NSArray,NSDictionary 或NSNull
         3.字典中所有的key必須是NSString類型的
         4.NSNumber的對象不能是NaN或無窮大
     */
    /*
     第一個參數(shù):要轉(zhuǎn)換成JSON數(shù)據(jù)的OC對象,這里為一個字典
     第二個參數(shù):NSJSONWritingPrettyPrinted對轉(zhuǎn)換之后的JSON對象進(jìn)行排版,無意義
     */
    NSData *data = [NSJSONSerialization dataWithJSONObject:dictM options:NSJSONWritingPrettyPrinted error:nil];

    //3.打印查看Data是否有值
    /*
     第一個參數(shù):要轉(zhuǎn)換為STring的二進(jìn)制數(shù)據(jù)
     第二個參數(shù):編碼方式,通常采用NSUTF8StringEncoding
     */
    NSString *strM = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@",strM);

(3)OC對象和JSON數(shù)據(jù)格式之間的一一對應(yīng)關(guān)系

//OC對象和JSON數(shù)據(jù)之間的一一對應(yīng)關(guān)系
-(void)oCWithJSON
{
    //JSON的各種數(shù)據(jù)格式
    //NSString *test = @"\"wendingding\"";
    //NSString *test = @"true";
    NSString *test = @"{\"name\":\"wendingding\"}";

    //把JSON數(shù)據(jù)->OC對象,以便查看他們之間的一一對應(yīng)關(guān)系
    //注意點(diǎn):如何被解析的JSON數(shù)據(jù)如果既不是字典也不是數(shù)組(比如是NSString), 那么就必須使用這NSJSONReadingAllowFragments
    id obj = [NSJSONSerialization JSONObjectWithData:[test dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];

    NSLog(@"%@", [obj class]);

    /* JSON數(shù)據(jù)格式和OC對象的一一對應(yīng)關(guān)系
         {} -> 字典
         [] -> 數(shù)組
         "" -> 字符串
         10/10.1 -> NSNumber
         true/false -> NSNumber
         null -> NSNull
     */
}
}

(4)如何查看復(fù)雜的JSON數(shù)據(jù)

方法一:
    在線格式化http://tool.oschina.net/codeformat/json
方法二:
    把解析后的數(shù)據(jù)寫plist文件,通過plist文件可以直觀的查看JSON的層次結(jié)構(gòu)。
    [dictM writeToFile:@"/Users/文頂頂/Desktop/videos.plist" atomically:YES];

(5)視頻的簡單播放

    //0.需要導(dǎo)入系統(tǒng)框架
    #import <MediaPlayer/MediaPlayer.h>

    //1.拿到該cell對應(yīng)的數(shù)據(jù)字典
    XMGVideo *video = self.videos[indexPath.row];

    NSString *videoStr = [@"http://120.25.226.186:32812" stringByAppendingPathComponent:video.url];

    //2.創(chuàng)建一個視頻播放器
    MPMoviePlayerViewController *vc = [[MPMoviePlayerViewController alloc]initWithContentURL:[NSURL URLWithString:videoStr]];
    //3.present播放控制器

    [self presentViewController:vc animated:YES completion:nil];

2.3 字典轉(zhuǎn)模型框架

(1)相關(guān)框架

 a.Mantle 需要繼承自MTModel
 b.JSONModel 需要繼承自JSONModel
 c.MJExtension 不需要繼承,無代碼侵入性

(2)自己設(shè)計(jì)和選擇框架時(shí)需要注意的問題

a.侵入性
b.易用性,是否容易上手
c.擴(kuò)展性,很容易給這個框架增加新的功能

(3)MJExtension框架的簡單使用

//1.把字典數(shù)組轉(zhuǎn)換為模型數(shù)組
    //使用MJExtension框架進(jìn)行字典轉(zhuǎn)模型
        self.videos = [XMGVideo objectArrayWithKeyValuesArray:videoArray];

//2.重命名模型屬性的名稱
//第一種重命名屬性名稱的方法,有一定的代碼侵入性
//設(shè)置字典中的id被模型中的ID替換
+(NSDictionary *)replacedKeyFromPropertyName
{
    return @{
             @"ID":@"id"
             };
}

//第二種重命名屬性名稱的方法,代碼侵入性為零
    [XMGVideo setupReplacedKeyFromPropertyName:^NSDictionary *{
        return @{
                 @"ID":@"id"
                 };
    }];

//3.MJExtension框架內(nèi)部實(shí)現(xiàn)原理-運(yùn)行時(shí)

3.0 XML解析
3.1 XML簡單介紹

(1) XML:可擴(kuò)展標(biāo)記語言

    a.語法
    b.XML文檔的三部分(聲明、元素和屬性)
    c.其它注意點(diǎn)(注意不能交叉包含、空行換行、XML文檔只能有一個根元素等)

(2) XML解析

    a.XML解析的兩種方式
        001 SAX:從根元素開始,按順序一個元素一個元素的往下解析,可用于解析大、小文件
        002 DOM:一次性將整個XML文檔加載到內(nèi)存中,適合較小的文件
    b.解析XML的工具
        001 蘋果原生NSXMLParser:使用SAX方式解析,使用簡單
        002 第三方框架
            libxml2:純C語言的,默認(rèn)包含在iOS SDK中,同時(shí)支持DOM和SAX的方式解析
            GDataXML:采用DOM方式解析,該框架由Goole開發(fā),是基于xml2的

3.2 XML解析

(1)使用NSXMLParser解析XML步驟和代理方法

//解析步驟:
//4.1 創(chuàng)建一個解析器
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
//4.2 設(shè)置代理
parser.delegate = self;
//4.3 開始解析
[parser parse];

-----------------------------------------

//1.開始解析XML文檔
-(void)parserDidStartDocument:(nonnull NSXMLParser *)parser

//2.開始解析XML中某個元素的時(shí)候調(diào)用,比如<video>
-(void)parser:(nonnull NSXMLParser *)parser didStartElement:(nonnull NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(nonnull NSDictionary<NSString *,NSString *> *)attributeDict
{
    if ([elementName isEqualToString:@"videos"]) {
        return;
    }
    //字典轉(zhuǎn)模型
    XMGVideo *video = [XMGVideo objectWithKeyValues:attributeDict];
    [self.videos addObject:video];
}

//3.當(dāng)某個元素解析完成之后調(diào)用,比如</video>
-(void)parser:(nonnull NSXMLParser *)parser didEndElement:(nonnull NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName

//4.XML文檔解析結(jié)束
-(void)parserDidEndDocument:(nonnull NSXMLParser *)parser

(2)使用GDataParser解析XML的步驟和方法

//4.0 配置環(huán)境
// 001 先導(dǎo)入框架,然后按照框架使用注釋配置環(huán)境
// 002 GDataXML框架是MRC的,所以還需要告訴編譯器以MRC的方式處理GDataXML的代碼

//4.1 加載XML文檔(使用的是DOM的方式一口氣把整個XML文檔都吞下)
    GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:data options:kNilOptions error:nil];

//4.2 獲取XML文檔的根元素,根據(jù)根元素取出XML中的每個子元素
  NSArray * elements = [doc.rootElement elementsForName:@"video"];

//4.3 取出每個子元素的屬性并轉(zhuǎn)換為模型
for (GDataXMLElement *ele in elements) {

    XMGVideo *video = [[XMGVideo alloc]init];
    video.name = [ele attributeForName:@"name"].stringValue;
    video.length = [ele attributeForName:@"length"].stringValue.integerValue;
    video.url = [ele attributeForName:@"url"].stringValue;
    video.image = [ele attributeForName:@"image"].stringValue;
    video.ID = [ele attributeForName:@"id"].stringValue;

    //4.4 把轉(zhuǎn)換好的模型添加到tableView的數(shù)據(jù)源self.videos數(shù)組中
    [self.videos addObject:video];
}

3.3 多值參數(shù)和中文輸出問題

(1)多值參數(shù)如何設(shè)置請求路徑

//多值參數(shù)
/*
 如果一個參數(shù)對應(yīng)著多個值,那么直接按照"參數(shù)=值&參數(shù)=值"的方式拼接
 */
-(void)test
{
    //1.確定URL
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/weather?place=Beijing&place=Guangzhou"];
    //2.創(chuàng)建請求對象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    //3.發(fā)送請求
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {

        //4.解析
        NSLog(@"%@",[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);
    }];
}

(2)如何解決字典和數(shù)組中輸出亂碼的問題

答:給字典和數(shù)組添加一個分類,重寫descriptionWithLocale方法,在該方法中拼接元素格式化輸出。
-(nonnull NSString *)descriptionWithLocale:(nullable id)locale

4.0 文件下載
4.1 小文件下載

(1)第一種方式(NSData)

//使用NSDta直接加載網(wǎng)絡(luò)上的url資源(不考慮線程)
-(void)dataDownload
{
    //1.確定資源路徑
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_01.png"];

    //2.根據(jù)URL加載對應(yīng)的資源
    NSData *data = [NSData dataWithContentsOfURL:url];

    //3.轉(zhuǎn)換并顯示數(shù)據(jù)
    UIImage *image = [UIImage imageWithData:data];
    self.imageView.image = image;

}

(2)第二種方式(NSURLConnection-sendAsync)

//使用NSURLConnection發(fā)送異步請求下載文件資源
-(void)connectDownload
{
    //1.確定請求路徑
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_01.png"];

    //2.創(chuàng)建請求對象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    //3.使用NSURLConnection發(fā)送一個異步請求
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        //4.拿到并處理數(shù)據(jù)
        UIImage *image = [UIImage imageWithData:data];
        self.imageView.image = image;

    }];

}

(3)第三種方式(NSURLConnection-delegate)

//使用NSURLConnection設(shè)置代理發(fā)送異步請求的方式下載文件
-(void)connectionDelegateDownload
{
    //1.確定請求路徑
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_01.mp4"];

    //2.創(chuàng)建請求對象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    //3.使用NSURLConnection設(shè)置代理并發(fā)送異步請求
    [NSURLConnection connectionWithRequest:request delegate:self];

}

#pragma mark--NSURLConnectionDataDelegate

//當(dāng)接收到服務(wù)器響應(yīng)的時(shí)候調(diào)用,該方法只會調(diào)用一次
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    //創(chuàng)建一個容器,用來接收服務(wù)器返回的數(shù)據(jù)
    self.fileData = [NSMutableData data];

    //獲得當(dāng)前要下載文件的總大?。ㄍㄟ^響應(yīng)頭得到)
    NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;
    self.totalLength = res.expectedContentLength;
    NSLog(@"%zd",self.totalLength);

    //拿到服務(wù)器端推薦的文件名稱
    self.fileName = res.suggestedFilename;

}
//當(dāng)接收到服務(wù)器返回的數(shù)據(jù)時(shí)會調(diào)用
//該方法可能會被調(diào)用多次
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
//    NSLog(@"%s",__func__);

    //拼接每次下載的數(shù)據(jù)
    [self.fileData appendData:data];

    //計(jì)算當(dāng)前下載進(jìn)度并刷新UI顯示
    self.currentLength = self.fileData.length;

    NSLog(@"%f",1.0* self.currentLength/self.totalLength);
    self.progressView.progress = 1.0* self.currentLength/self.totalLength;

}
//當(dāng)網(wǎng)絡(luò)請求結(jié)束之后調(diào)用
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    //文件下載完畢把接受到的文件數(shù)據(jù)寫入到沙盒中保存

    //1.確定要保存文件的全路徑
    //caches文件夾路徑
    NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];

    NSString *fullPath = [caches stringByAppendingPathComponent:self.fileName];

    //2.寫數(shù)據(jù)到文件中
    [self.fileData writeToFile:fullPath atomically:YES];

    NSLog(@"%@",fullPath);
}

//當(dāng)請求失敗的時(shí)候調(diào)用該方法
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"%s",__func__);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • JSON JSON和XML都是需要解析的 JSON是一種輕量級的數(shù)據(jù)格式,一般用于數(shù)據(jù)交互服務(wù)器返回給客戶端的數(shù)據(jù)...
    JonesCxy閱讀 2,008評論 2 10
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,361評論 4 61
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評論 19 139
  • iOS開發(fā)系列--網(wǎng)絡(luò)開發(fā) 概覽 大部分應(yīng)用程序都或多或少會牽扯到網(wǎng)絡(luò)開發(fā),例如說新浪微博、微信等,這些應(yīng)用本身可...
    lichengjin閱讀 4,040評論 2 7
  • 這幾天不知怎么有點(diǎn)倦怠了,因?yàn)橹坝型A艘惶欤驗(yàn)槭謾C(jī)忘在外面了。 我最近生活的確有些改變。本來國慶準(zhǔn)備出去學(xué)習(xí),...
    何偀閱讀 239評論 1 0

友情鏈接更多精彩內(nèi)容