iOS開發網絡篇—使用ASI框架進行文件下載

iOS開發網絡篇—使用ASI框架進行文件下載編程

說明:本文介紹iOS網絡編程中常常用到的框架ASI,如何使用該框架進行文件的下載。服務器

1、簡單介紹網絡

代碼示例:app

 1 #import "YYViewController.h"
 2 #import "ASIHTTPRequest.h"
 3 
 4 @interface YYViewController ()
 5 
 6 
 7 @end
 8 
 9 @implementation YYViewController
10 
11 - (void)viewDidLoad
12 {
13     [super viewDidLoad];
14 }
15 
16 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
17 {
18     //下載服務器上的文件
19     [self download];
20 }
21 
22 #pragma mark-下載文件
23 -(void)download
24 {    //1.建立請求對象
25     NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/resources/video.zip"];
26     ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url];
27     
28     //2.添加請求參數(請求體中的參數)
29     [request setDataReceivedBlock:^(NSData *data) {
30         NSLog(@"%d",data.length);
31     }];
32     
33     //3.異步發送網絡請求
34     [request startAsynchronous];
35 }
36 
37 @end

代碼說明:上面的代碼從服務器上異步下載文件,每當接收到數據的時候就打印接收到的數據的長度。框架

打印結果以下:異步

注意:在實際的開發中不能這樣去下載文件,由於他不斷的拼接文件數據的操做是在內存中進行的,若是所下載文件的數據較大,那麼將會直接致使內存爆掉。ide

2、實際開發中的使用性能

代碼示例(演示2):atom

 1 #import "YYViewController.h"
 2 #import "ASIHTTPRequest.h"
 3 
 4 @interface YYViewController ()
 5 
 6 
 7 @end
 8 
 9 @implementation YYViewController
10 
11 - (void)viewDidLoad
12 {
13     [super viewDidLoad];
14 }
15 
16 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
17 {
18     //下載服務器上的文件
19     [self download1];
20 }
21 
22 #pragma mark-下載文件
23 //演示1
24 -(void)download
25 {    //1.建立請求對象
26     NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/resources/video.zip"];
27     ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url];
28     
29     //2.添加請求參數(請求體中的參數)
30     [request setDataReceivedBlock:^(NSData *data) {
31         NSLog(@"%d",data.length);
32     }];
33     
34     //3.異步發送網絡請求
35     [request startAsynchronous];
36 }
37 
38 //演示2
39 -(void)download1
40 {
41     //1.建立請求對象
42     NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/resources/video.zip"];
43     ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url];
44     
45     //2.設置下載文件保存的路徑
46     NSString *cachepath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
47     NSString *filename=[cachepath stringByAppendingPathComponent:@"video.zip"];
48     request.downloadDestinationPath=filename;
49     NSLog(@"%@",filename);
50     
51     //3.發送網絡請求(異步)
52     [request startAsynchronous];
53     
54     //4.當下載完成後通知
55     [request setCompletionBlock:^{
56         NSLog(@"下載成功");
57     }];
58 }
59 
60 @end

下載成功:url

代碼說明:

在實際的開發中若是要使用asi框架來下載服務器上的文件,只須要執行下面簡單的幾個步驟便可(參照上面的代碼)。

(1)建立請求對象;

(2)設置下載文件保存的路徑;

(3)發送下載文件的網絡請求(異步)。

按照上面的幾個步驟執行,程序會自動開啓異步線程,一點一點的把數據寫入到指定的文件路徑,並且不管是下載多大的文件都不會佔用大量的內存空間。

asi框架是基於底層的cfnoteworking的,性能很好。固然也能夠設置block,或者是監聽下載的進度。

下面介紹使用asi框架下載文件,如何監聽下載的進度。

設置下載代理,注意不是控制器代理。

代碼示例:

 1 #import "YYViewController.h"
 2 #import "ASIHTTPRequest.h"
 3 
 4 @interface YYViewController ()<ASIProgressDelegate>
 5 @property (weak, nonatomic) IBOutlet UIProgressView *progress;
 6 @end
 7 
 8 @implementation YYViewController
 9 
10 - (void)viewDidLoad
11 {
12     [super viewDidLoad];
13 }
14 
15 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
16 {
17     //下載服務器上的文件
18     [self download];
19 }
20 
21 #pragma mark-下載文件
22 -(void)download
23 {
24     //1.建立請求對象
25     NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/resources/video.zip"];
26     ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url];
27     
28     //2.設置下載文件保存的路徑
29     NSString *cachepath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
30     NSString *filename=[cachepath stringByAppendingPathComponent:@"video.zip"];
31     request.downloadDestinationPath=filename;
32     NSLog(@"%@",filename);
33     
34     //3.設置下載進度的代理
35     request.downloadProgressDelegate=self.progress;
36     
37     //4.發送網絡請求(異步)
38     [request startAsynchronous];
39     
40     //5.下載完畢後通知
41     [request setCompletionBlock:^{
42         NSLog(@"文件已經下載完畢");
43     }];
44 }
45 
46 #pragma mark-監聽下載進度的代理方法

asi的文件下載還有一個屬性能夠設置是否支持斷點下載。

設置支持斷點下載的代碼以下:

 request.allowResumeForFileDownloads=YES;

這樣的話,好比一個文件已經下載了百分之30到程序的沙盒中,這個時候取消了下載。當下一次點擊下載文件的時候,會接着下載剩餘的百分之70並一點一點的寫入到沙盒中。

提示:取消下載的代碼爲:

    [request clearDelegatesAndCancel];

 

三,結合一些進度顯示的第三方框架使用

去code4app上面隨便下載一個顯示下載進度的第三方框架,這裏以DACircularProgressView爲例子。

導入該框架必要的文件後,簡單使用以下。

代碼示例:

 1 #import "YYViewController.h"
 2 #import "ASIHTTPRequest.h"
 3 #import "DACircularProgressView.h"
 4 
 5 @interface YYViewController ()<ASIProgressDelegate>
 6 
 7 @property (weak, nonatomic) IBOutlet DACircularProgressView *circularView;
 8 @property (weak, nonatomic) IBOutlet UIProgressView *progress;
 9 @end
10 
11 @implementation YYViewController
12 
13 - (void)viewDidLoad
14 {
15     [super viewDidLoad];
16     
17     //設置基本的一些屬性
18     self.circularView.trackTintColor=[UIColor lightGrayColor];
19     self.circularView.progressTintColor=[UIColor yellowColor];
20 }
21 
22 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
23 {
24     //下載服務器上的文件
25     [self download];
26 }
27 
28 #pragma mark-下載文件
29 -(void)download
30 {
31     //1.建立請求對象
32     NSURL *url=[NSURL URLWithString:@"http://127.0.0.1:8080/MJServer/resources/video.zip"];
33     ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url];
34     
35     //2.設置下載文件保存的路徑
36     NSString *cachepath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
37     NSString *filename=[cachepath stringByAppendingPathComponent:@"video.zip"];
38     request.downloadDestinationPath=filename;
39     NSLog(@"%@",filename);
40     
41     //3.設置下載進度的代理
42     request.downloadProgressDelegate=self.circularView;
43     
44     //4.發送網絡請求(異步)
45     [request startAsynchronous];
46     
47     //5.設置支持斷點下載
48     request.allowResumeForFileDownloads=YES;
49     
50     //5.下載完畢後通知
51     [request setCompletionBlock:^{
52         NSLog(@"文件已經下載完畢");
53     }];
54 }
55 
56 #pragma mark-監聽下載進度的代理方法
57 @end

顯示效果:

特別提示:

相關文章
相關標籤/搜索