在移動互聯網時代,幾乎所有應用都需要用到網路下載,比如圖片的載入,音樂的下載,安裝包的下載,等等,下麵我們來看看如何進行下載一、文件的下載我們用get來請求數據,並對請求的二進位數據進行解析存入文件,首先我們先引入一個第三方進度條 ,並且進行初始化- (void)viewDidLoad { [...
在移動互聯網時代,幾乎所有應用都需要用到網路下載,比如圖片的載入,音樂的下載,安裝包的下載,等等,下麵我們來看看如何進行下載
一、文件的下載我們用get來請求數據,並對請求的二進位數據進行解析存入文件,首先我們先引入一個第三方進度條 ,並且進行初始化
- (void)viewDidLoad { [super viewDidLoad]; //設置背景色 self.view.backgroundColor=[UIColor greenColor]; //引入第三方進度條 self.da=[[DACircularProgressView alloc] initWithFrame:CGRectMake(375/2.0-50, 30, 100, 100)]; [self.view addSubview:self.da]; }
二、設置文件下載地址,開始下載數據
#pragma mark - 開始下載數據 - (void) start{ //設置網路資源地址 NSString * str=@"http://dl.g.youku.com/20151023/1445588041_20151023XXXX.apk"; NSURL * url=[NSURL URLWithString:str]; NSMutableURLRequest * request=[NSMutableURLRequest requestWithURL:url]; // 設置Range,代表請求的開始位置,剛開始的預設位置為0 [request setValue:[NSString stringWithFormat:@"bytes=%ld-",self.currentLength] forHTTPHeaderField:@"Range"]; //發送請求 self.conn= [NSURLConnection connectionWithRequest:request delegate:self]; }
三、實現代理方法
在下載的時候我們通常採用可變的NSMutableData來存下載的數據,但是用這種方式會導致記憶體越來越大,本來手機的記憶體都是有限的,因此我們需要對其進行優化,防止閃退,解決方式是我們不採用將請求的數據緩存帶記憶體中,而是採取及時下載及時緩存的方式,每次下載都寫入文件,代碼如下
@interface ViewController ()<NSURLConnectionDataDelegate> /** 當前下載長度*/ @property(nonatomic,assign) NSInteger currentLength; /** 文件總長度*/ @property(nonatomic,assign) NSInteger totalLength; /** 鏈接長度*/ @property(nonatomic,strong) NSURLConnection * conn; /** 文件寫入句柄*/ @property(nonatomic,strong) NSFileHandle * handle; /** 第三方進度條*/ @property(nonatomic,strong) DACircularProgressView * da; /** 第三方進度條*/ @property(nonatomic,weak) DPMeterView * dp; @end #pragma mark - 響應代理方法,在沙盒創建文件和文件句柄 - (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ if (self.totalLength<=0) { self.totalLength=response.expectedContentLength; } //創建文件操作句柄 if (self.handle==nil) { //獲取文件路徑 NSString *path=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; path=[path stringByAppendingPathComponent:@"jereh.apk"]; //創建管理類 NSFileManager * manager=[NSFileManager defaultManager]; [manager createFileAtPath:path contents:nil attributes:nil]; //初始化管理句柄 self.handle=[NSFileHandle fileHandleForWritingAtPath:path]; } } #pragma mark - 接受數據代理方法,將接受到的數據寫入文件,並且計算下載進度 - (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ //記錄當前長度,算取百分比 self.currentLength+=data.length; CGFloat percent=self.currentLength*1.0/self.totalLength; //移動到文件末尾 [self.handle seekToEndOfFile]; //將當前數據寫入文件 [self.handle writeData:data]; //修改進度條 self.da.progress=percent; }
四、在文件下載時候我們需要暫停功能,如何讓一個下載中的請求暫停呢?我們只需要調用取消方法即可
#pragma mark - 設置暫停方法 - (void) pause{ [self.conn cancel]; self.conn=nil; }
五、最後關閉句柄
#pragma mark - 關閉句柄 -(void)dealloc{ [self.handle closeFile]; }
作者:傑瑞教育
出處:http://www.cnblogs.com/jerehedu/
版權聲明:本文版權歸煙台傑瑞教育科技有限公司和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
技術咨詢: