文件下载(NSURLConnection/NSURLSession)

最基本的网络文件下载(使用原生的网络请求)

#pragma mark - 小文件下载

// 方法一: NSData dataWithContentsOfURL
- (void)downloadFile1
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 其实这就是一个GET请求
        NSURL *url = [NSURL URLWithString:@"http://localhost:8080/Server/resources/images/minion_01.png"];
        NSData *data = [NSData dataWithContentsOfURL:url];
        NSLog(@"%lu", data.length);
    });
}
// 方法二: NSURLConnection
- (void)downloadFile2
{
    NSURL *url = [NSURL URLWithString:@"http://localhost:8080/Server/resources/images/minion_01.png"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        NSLog(@"%lu", data.length);
    }];
}
//方法三:NSURLSession iOS7开始出现的 为取代NSURLConnection
- (void)downloadFile3
{
    // 1.得到session对象
    NSURLSession *session = [NSURLSession sharedSession];

    // 2.创建一个下载task
    NSURL *url = [NSURL URLWithString:@"http://localhost:8080/Server/resources/test.mp4"];
    NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {// location : 临时文件的路径(下载好的文件)

        NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
        // response.suggestedFilename : 建议使用的文件名,一般跟服务器端的文件名一致
        NSString *file = [caches stringByAppendingPathComponent:response.suggestedFilename];

        // 将临时文件剪切或者复制Caches文件夹
        NSFileManager *mgr = [NSFileManager defaultManager];

        // AtPath : 剪切前的文件路径
        // ToPath : 剪切后的文件路径
        [mgr moveItemAtPath:location.path toPath:file error:nil];
    }];

    // 3.开始任务
    [task resume];
}

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; color: #78492a }
span.s1 { }
span.s2 { font: 20.0px "PingFang SC" }

#pragma mark - 大文件下载

//方法一: NSURLConnection (合理:单个线程 下载一点就写入一点)使用NSFileHandle
//句柄对象
@property (nonatomic, strong) NSFileHandle * writeHandle;

- (void)downloadFile4
{
    NSURL *url = [NSURL URLWithString:@"http://localhost:8080/Server/resources/videos.zip"];

    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    // 下载(创建完conn对象后,会自动发起一个异步请求,通过delegate回调下载信息)
    [NSURLConnection connectionWithRequest:request delegate:self];
}

#pragma mark - NSURLConnectionDataDelegate
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{//请求失败

}

// 1.接收到服务器的响应就会调用
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    // 文件路径
    NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    NSString *filepath = [caches stringByAppendingPathComponent:@"videos.zip"];

    // 创建一个空的文件 到 沙盒中
    NSFileManager *mgr = [NSFileManager defaultManager];
    [mgr createFileAtPath:filepath contents:nil attributes:nil];

    // 创建一个用来写数据的文件句柄
    self.writeHandle = [NSFileHandle fileHandleForWritingAtPath:filepath];
}

// 2.当接收到服务器返回的实体数据时调用(具体内容,这个方法可能会被调用多次)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // 移动到文件的最后面
    [self.writeHandle seekToEndOfFile];

    // 将数据写入沙盒
    [self.writeHandle writeData:data];
}

// 3.加载完毕后调用(服务器的数据已经接收完毕)
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;
{
    // 关闭文件 设置为空
    [self.writeHandle closeFile];
    self.writeHandle = nil;
}
//文件流
@property (nonatomic, strong) NSOutputStream * fileStream;

//方法二: NSURLConnection 使用NSOutputStream
- (void)downloadFile6
{
    NSURL *url = [NSURL URLWithString:@"http://localhost:8080/Server/resources/videos.zip"];

    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    // 下载(创建完conn对象后,会自动发起一个异步请求,通过delegate回调下载信息)
    [NSURLConnection connectionWithRequest:request delegate:self];
}

#pragma mark - NSURLConnectionDataDelegate
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{//请求失败

}

// 1.接收到服务器的响应就会调用
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    // 文件路径
    NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    NSString *filepath = [caches stringByAppendingPathComponent:@"videos.zip"];

    // 创建一个空的文件 到 沙盒中
    NSFileManager *mgr = [NSFileManager defaultManager];
    [mgr createFileAtPath:filepath contents:nil attributes:nil];

    // 创建一个用来写数据的文件句柄
    self.fileStream = [NSOutputStream outputStreamToFileAtPath:filepath append:YES];
}

// 2.当接收到服务器返回的实体数据时调用(具体内容,这个方法可能会被调用多次)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    //将数据追加到文件流中
    [self.fileStream write:data.bytes maxLength:data.length];
}

// 3.加载完毕后调用(服务器的数据已经接收完毕)
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;
{
    // 关闭文件流
    [self.fileStream close];
}

更多内容--> 博客导航 每周一篇哟!!!

有任何关于iOS开发的问题!欢迎下方留言!!!或者邮件[email protected] 虽然我不一定能够解答出来,但是我会请教iOS开发高手!!!解答您的问题!!!

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; color: #78492a }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; color: #008400 }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; color: #000000 }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; color: #3e1e81 }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; color: #d12f1b }
span.s1 { }
span.s2 { font: 20.0px "PingFang SC" }
span.s3 { color: #ba2da2 }
span.s4 { color: #000000 }
span.s5 { color: #78492a }
span.s6 { color: #272ad8 }
span.s7 { color: #703daa }
span.s8 { color: #3e1e81 }
span.s9 { color: #d12f1b }

时间: 2024-11-02 08:52:12

文件下载(NSURLConnection/NSURLSession)的相关文章

NSURLConnection / NSURLSession/ SDWebImage

1. NSURLConnection (iOS9开始被弃用)=========================================== 此类的对象加载一个URL请求对象,通过异步/同步的方式发送请求,并获得响应. 此类位于Foundation框架下,继承自NSObject ------------------------------ 异步/同步?    通讯方式 异步:在请求发送后,无需等待响应结果,而是可以继续后续其他操作,该请求的响应在回调方法中处理(通常用到的代理方法或bloc

文件下载 NSURLConnection——小文件下载

1.下载小文件,只适合几百k,1.2M的文件 //1.设置网址 //2.加载请求 //3.设置代理 //4.实现代理方法下载文件 NSURL *url = [NSURL URLWithString:@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1492791082124&di=fc642407b4ec19430334653a9b873cff&imgtype=0&a

iOS NSURLSession VS NSURLConnection

NSURLSession VS NSURLConnection NSURLSession可以看做是NSURLConnection的进化版,其对NSURLConnection的改进点有: * 根据每个Session做配置(http header,Cache,Cookie,protocal,Credential),不再在整个App层面共享配置. * 支持网络操作的取消和断点续传 * 改进了授权机制的处理 * 丰富的Delegate模型 * 分离了真实数据和网络配置数据. * 后台处理上传和下载,即使

OC - 16.大文件下载

大文件下载注意事项 若不对下载的文件进行转存,会造成内存消耗急剧升高,甚至耗尽内存资源,造成程序终止. 在文件下载过程中通常会出现中途停止的状况,若不做处理,就要重新开始下载,浪费流量. 大文件下载的解决方案 对下载文件进行处理,每下载一点数据,就将数据写到磁盘中(通常是沙盒中),避免在内存累积数据(NSURLConnection下载) 使用NSFileHandle类实现写数据 使用NSOutputStream类实现写数据 当下载任务终止时,记录任务终止时的位置信息,以便下次开始继续下载 大文件

iOS网络-04-大文件下载

大文件下载注意事项 若不对下载的文件进行转存,会造成内存消耗急剧升高,甚至耗尽内存资源,造成程序终止. 在文件下载过程中通常会出现中途停止的状况,若不做处理,就要重新开始下载,浪费流量. 大文件下载的解决方案 对下载文件进行处理,每下载一点数据,就将数据写到磁盘中(通常是沙盒中),避免在内存累积数据(NSURLConnection下载) 使用NSFileHandle类实现写数据 使用NSOutputStream类实现写数据 当下载任务终止时,记录任务终止时的位置信息,以便下次开始继续下载 大文件

[ 流行的网络框架 ] AFN & ASI

1.AFN & ASI(早已经停止更新,但现在许多公司也在使用.) AFNetWorking地址:https://github.com/AFNetworking/AFNetworking ASIHTTPRequest地址:https://github.com/paytronix/ASIHTTPRequest 2.AFN与ASI对比 -- AFN1. 基于 NSURLConnection & NSURLSession 进行的封装2. 使用简单3. 提供了自动的序列化 & 反序列化支持

IOS之开发Block

数据存储 plist,FMDB,归档.网络数据的传输与解析,网络传输建议用JSON格式数据,冗余数据少. 数据下载下来缓存,可直接把缓存保存成文件,便于处理缓存中的文件.根据需求来定. block: 1.什么是block //能极大的简化代码,提高效率.很多重要的开源库当中用block写的,不一定自己写,但是要知道怎么写. UI开发和网络常见功能实现回调,按钮的事件处理方法是回调方法,网络下载后的回调处理 (1).按钮target action 一个方法传入按钮中 (2).表格视图 传入一个指针

iOS基础问答面试题连载(三)-附答案

「Tim的博客」iOS基础问答面试题连载(一)-附答案 「Tim的博客」iOS基础问答面试题连载(二)-附答案 「Tim的博客」iOS基础问答面试题连载(三)-附答案 「Tim的博客」iOS基础问答面试题连载(四) 这次的问题是网络多线程相关的哟,面试的时候也是必问的,大家多看看 11月24日修正一处错误:18.19题目一样,答案不一样(其实是两种理解,修改为最优的一种放上来.多谢读者提醒) 以下是一些自己收集的网络多线程方面比较基础的问题(大神可以忽略),附上答案,方便大家阅读.俗话说得好,基

iOS启动图-从网络获取的gif图,在本地一直是没有动画,还模糊的

背景介绍:APP启动页,常有静态图加链接,gif加链接,短视频等几种形式.我们APP前期只有静态图这一种,功能已经实现.之后,有了添加gif的需求,按理说,只要添加一个类型判断,按照数据类型,通过不同方法展示内容即可,但是一直不可以..出了这样的问题,下好的gif图,内容类型没错但是通过对应的gif方法显示的内容一直是一张静态图,并且还是模糊的.因为之前的下载图片,以及显示图片的逻辑完全没问题,所以定位问题在显示gif的方法上,所以走了弯路,但是这条弯路是必然要走的. 下面开始我们的星辰大海,我