iOS網絡--同步,異步下載數據

一、

        這一節我們來學習幾種下載數據的方式,目的在於學習同步,異步下載數據的知識。

二、

        1.直接同步下載數據

//直接下載 同步下載 阻塞主線程
NSURL * url = [NSURL URLWithString:@"http://127.0.0.1/upload/image/timg.png"];
NSData * imageData = [NSData dataWithContentsOfURL:url];
UIImage *  image = [UIImage imageWithData:imageData];
//顯示圖片
self.imageView.image = image;

這裏我們直接使用一個url就去獲取數據,這種獲取數據的方式就是同步的方式。這種方式會阻塞主線程,表現出來的效果就是用戶界面卡頓。

      2.通過請求同步下載數據

//直接下載 同步下載 阻塞主線程
NSURL * url = [NSURL URLWithString:@"http://127.0.0.1/upload/video/1.mp4"];
//創建請求
NSURLRequest * request = [NSURLRequest requestWithURL:url];
//發起連接
[NSURLConnection connectionWithRequest:request delegate:self];

 這裏我們創建了一個URL,然後通過這個URL來創建一個NSURLRequest,然後使用[NSURLConnection connectionWithRequest:delegate:]這個方法來發送同步請求。注意delegate參數表示回調的對象。所以我們要在這個類中實現數據回調的方法:

            2.1.接收到響應頭的方法,一般通過這個方法來計算所請求的數據的大小。

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    //服務器端返回客戶端的響應信息,描述客戶端請求的數據的詳細信息
    
    NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *)response;
    //獲取文件的大小
    self.size = httpResponse.expectedContentLength;
    //創建容器
    self.mediaData = [NSMutableData dataWithCapacity:self.size];

}

            2.2.真實的獲取數據的方法

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    //服務器端向客戶端返回的數據包
    //保存數據
    [self.mediaData appendData:data];
    //計算進度
    CGFloat rate = data.length*1.0/self.size;
    //顯示到progressview
    self.progressView.progress += rate;
    //lable顯示
    self.progressLabel.text = [NSString stringWithFormat:@"%.1f%\%",self.progressView.progress*100.0];
}

這個方法是真正的回調數據的方法,一般我們都需要將獲取到的數據添加到一個可變的數據(NSMutableData) 裏面。

            2.3.數據下載完畢回調的方法

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    //數據下載完畢
    UIImage * image = [UIImage imageWithData:self.mediaData];
    self.imageView.image = image;
}

在這個方法中我們才知道數據真正下載完畢了,纔去做相關的操作。由於是同步的,所以在主線程中,所以在這裏面可以直接操作UI。 

      3.通過請求異步下載數據

NSURL * url = [NSURL URLWithString:@"http://127.0.0.1/upload/image/timg.png"];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
NSLog(@"%@",[NSThread currentThread]);
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        //在主線程中操作UI
        UIImage *  image = [UIImage imageWithData:data];
        NSLog(@"%@",[NSThread currentThread]);
        //顯示圖片 將UI操作放在主線程
        self.imageView.image = image;
}];

這裏我們創建了一個URL,然後通過這個URL來創建一個NSURLRequest,接着使用[NSURLConnection sendAsynchronousRequest:queue: completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {}],來發送這個請求,這個請求是異步請求。通過一個block回調數據。在block中進行相關的操作,需要注意的是如果block中是對UI的操作,應該在主線程中做,那麼前面的queue傳遞的參數就應該是主隊列。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章