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传递的参数就应该是主队列。

 

发布了32 篇原创文章 · 获赞 8 · 访问量 9485
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览