網絡篇-NSURLConnection進度下載

NSURLConnection-上傳

簡述:服務器

這裏使用的是NSURLConnection的代理請求下載,而且是具備進度,UI能實時刷新,至於NSURLConnection如何請求、而且有幾種請求方法請看NSURLConnection請求簡介,在這裏的話咱們如下載一本書籍爲例,下面爲它的地址(這是在百度雲裏面弄的,連接是別人加密了,全部比較長)網絡

http://d.pcs.baidu.com/file/2b66fa1c93d8322d5299a1befc59b16c?fid=204559171-250528-1042286675318370&time=1453435914&rt=sh&sign=FDTAERV-DCb740ccc5511e5e8fedcff06b081203-X%2Bcz8N4IQb25c4wIKAyYl1HHW2M%3D&expires=8h&chkv=1&chkbd=0&chkpc=&dp-logid=498837374116132296&dp-callid=0&r=107651804

代碼:性能

一、首先在storyboard裏面拖入一個Progress View(進度條)控件
二、在控制器中拖入Progress View屬性,而且另外添加三個屬性,以下:
    @interface ViewController ()<NSURLConnectionDelegate>
    /** 進度條屬性*/
    @property (weak, nonatomic) IBOutlet UIProgressView *progressView;
    /** 文件總大小 */
    @property (nonatomic, assign) NSUInteger totalLength;
    /** 文件當前大小 */
    @property (nonatomic, assign) NSUInteger currentLength;
    /** 文件路徑 */
    @property (nonatomic, copy) NSString *path;
    @end

三、肯定它的URL,以及請求,而且設置它的代理,而後發送所謂的代理請求
    - (void)viewDidLoad {
        [super viewDidLoad];
        //一、肯定URL
        NSURL *url = [NSURL URLWithString:@"http://d.pcs.baidu.com/file/2b66fa1c93d8322d5299a1befc59b16c?fid=204559171-250528-1042286675318370&time=1453435914&rt=sh&sign=FDTAERV-DCb740ccc5511e5e8fedcff06b081203-X%2Bcz8N4IQb25c4wIKAyYl1HHW2M%3D&expires=8h&chkv=1&chkbd=0&chkpc=&dp-logid=498837374116132296&dp-callid=0&r=107651804"];
        //二、建立請求對象
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        //三、代理請求
        /*
         第一個參數:請求對象
         第二個參數:誰成爲代理
         第三個參數:startImmediately :是否當即開始發送網絡請求
         */
        NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];
        [connection start];
    }
四、在這個Demo中,代理有兩個方法是很重要的
    4.一、第一個就是剛開始響應的時候,在響應頭中,我能夠獲取文件的預估大小和文件名後綴,用來建立文件夾和記錄文件的總大小,用於後面的計算
    4.二、第二個就是每次接受到服務器數據的時候,我能夠往某個文件寫數據,以及計算每次佔比例的多少
    //1.當接受到服務器響應的時候會調用:response(響應頭)
    -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
    {
        NSLog(@"接受到響應");
        //一、在響應頭中有一個預估的文件大小expectedContentLength
        self.totalLength = response.expectedContentLength;
        //這裏大家能夠打印看看   而後在網頁的請求頭也能夠去對比一下,看是否爲同樣
        //    NSLog(@"totalLength = %lld", response.expectedContentLength);
        //二、這裏的話爲了讓性能好一點,我直接在沙盒的Caches中建立一個文件夾直接寫的硬盤上,而不是內存中
        //2.一、這裏是地址爲   在沙盒路徑的Caches中  添加一個文件名爲suggestedFilename的文件,suggestedFilename是響應頭中的,也是百度雲弄的名字大家也能夠打印看看
        //    NSLog(@"%@",response.suggestedFilename);
        NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingString:response.suggestedFilename];
        //2.二、拿到地址那咱們開始建立一個空得文件夾,而且路徑給外面的path屬性,用於後面拿到位置下載
        NSFileManager *manager = [NSFileManager defaultManager];
        [manager createFileAtPath:path contents:nil attributes:nil];
        self.path = path;
    }
    //2.當接受到服務器返回數據的時候調用(會調用屢次)
    -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
    {
        // 一、建立一個操做文件的句柄,而且給予上次的建立文件夾的地址。
        NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:self.path];
        //設置寫入方式,自上次後面寫入
        [handle seekToEndOfFile];
        // 二、利用句柄往文件中寫入數據
        [handle writeData:data];
        // 三、計算當前接收到得數據的總數  這裏就是記錄每一次寫入數據的多少
        self.currentLength += data.length;
        // 四、計算下載比例
        self.progressView.progress = 1.0 * self.currentLength/self.totalLength;
    }
    //3.當請求失敗的時候調用
    -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
    {
        NSLog(@"請求失敗");
    }
    //4.當請求結束(成功|失敗)的時候調用
    -(void)connectionDidFinishLoading:(NSURLConnection *)connection
    {
        NSLog(@"請求結束");
    }

補充atom

在這個Demo中惟一的優勢就是節約了內存,由於每一次寫都寫到了硬盤中去,而不是內存中,如今大家能夠打開大家本身的沙盒裏面應該會有一個PDF的文件也就是剛剛下載的。加密

結束url

本章到此結束
            歡迎各位碼友隨意轉載並指正
相關文章
相關標籤/搜索