首页 > 代码库 > iOS开发网络篇—文件下载(一·不合理)

iOS开发网络篇—文件下载(一·不合理)

iOS开发网络篇—文件下载(一·不合理)

一、小文件下载

如果文件比较小,下载方式会比较多

直接用NSData的+ (id)dataWithContentsOfURL:(NSURL *)url;

利?NSURLConnection发送一个HTTP请求去下载

如果是下载图片,还可以利用SDWebImage框架 

二、沙盒

  1.在finder中,系统的一些文件(资源库)是隐藏的,可以通过在终端运行下图的代码,显示隐藏的文件。

显示隐藏系统文件:

defaults write com.apple.finder AppleShowAllFiles YES

2.制作替身,以便查看应用沙盒。

推荐工具,SimPholders,可以用来查看沙盒。

 

三、大文件下载示例

提示:该项目代码,仅为示例,并不合理。

 1 // 2 //  YYViewController.m 3 //  01-文件的下载(不合理) 4 // 5 //  Created by apple on 14-6-30. 6 //  Copyright (c) 2014年 itcase. All rights reserved. 7 // 8  9 #import "YYViewController.h"10 11 @interface YYViewController ()12 @property(nonatomic,strong)NSMutableData *fileData;13 - (IBAction)star;14 15 @end16 17 @implementation YYViewController18 19 - (void)viewDidLoad20 {21     [super viewDidLoad];22 }23 24 - (IBAction)star {25     //创建下载路径26     27     NSURL *url=[NSURL URLWithString:@"http://192.168.1.53:8080/MJServer/resources/videosres.zip"];28     29     //创建一个请求30     NSURLRequest *request=[NSURLRequest requestWithURL:url];31     32     //发送请求(使用代理的方式)33     NSURLConnection *connt=[NSURLConnection connectionWithRequest:request delegate:self];34     [connt start];35 }36 37 #pragma mark- NSURLConnectionDataDelegate代理方法38 /*39  *当接收到服务器的响应(连通了服务器)时会调用40  */41 -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response42 {43     //初始化data44     self.fileData=http://www.mamicode.com/[NSMutableData data];45 }46 47 /*48  *当接收到服务器的数据时会调用(可能会被调用多次,每次只传递部分数据)49  */50 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data51 {52     //一点一点接收数据。53     NSLog(@"接收到服务器的数据!---%d",data.length);54     [self.fileData appendData:data];55 }56 57 /*58  *当服务器的数据加载完毕时就会调用59  */60 -(void)connectionDidFinishLoading:(NSURLConnection *)connection61 {62     // 下载完毕63     // 大文件不放Documents, 可以放Library\Caches或者tmp64 //    NSString *fullpath=[caches stringByAppendingString:@"video.zip"];65     66     NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];67     NSString *filepath = [caches stringByAppendingPathComponent:@"video.zip"];68     [self.fileData writeToFile:filepath atomically:YES];69     70     NSLog(@"下载完毕");71 }72 /*73  *请求错误(失败)的时候调用(请求超时\断网\没有网\,一般指客户端错误)74  */75 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error76 {77 }78 79 @end

模拟器:

点击屏幕上得点击下载按钮,下载在本地服务器上的文件。

代码说明:

在处理大文件下载问题上,无论使用同步或者异步的方式下载,都是一次性拿到所有的数据,不可取。所以更合适的是使用代理的方式进行处理。

这个项目中,花了很长的时间在拼接数据上,此外又花费了很长的时间放在了写入系统沙盒上。且会占用大量的内存空间。这种方法是不合理的,更合适的方法应该是一边拼接数据,一边写入硬盘。