标签:
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 @end 16 17 @implementation YYViewController 18 19 - (void)viewDidLoad 20 { 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 *)response 42 { 43 //初始化data 44 self.fileData=[NSMutableData data]; 45 } 46 47 /* 48 *当接收到服务器的数据时会调用(可能会被调用多次,每次只传递部分数据) 49 */ 50 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 51 { 52 //一点一点接收数据。 53 NSLog(@"接收到服务器的数据!---%d",data.length); 54 [self.fileData appendData:data]; 55 } 56 57 /* 58 *当服务器的数据加载完毕时就会调用 59 */ 60 -(void)connectionDidFinishLoading:(NSURLConnection *)connection 61 { 62 // 下载完毕 63 // 大文件不放Documents, 可以放Library\Caches或者tmp 64 // 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 *)error 76 { 77 } 78 79 @end
模拟器:
点击屏幕上得点击下载按钮,下载在本地服务器上的文件。
代码说明:
在处理大文件下载问题上,无论使用同步或者异步的方式下载,都是一次性拿到所有的数据,不可取。所以更合适的是使用代理的方式进行处理。
这个项目中,花了很长的时间在拼接数据上,此外又花费了很长的时间放在了写入系统沙盒上。且会占用大量的内存空间。这种方法是不合理的,更合适的方法应该是一边拼接数据,一边写入硬盘。
标签:
原文地址:http://www.cnblogs.com/junhuawang/p/4388494.html