iOS- 利用AFNetworking(AFN) - 實現文件斷點下載

iOS- 利用AFNetworking(AFN) - 實現文件斷點下載

 
 
  
官方建議AFN的使用方法

 

 1. 定義一個全局的AFHttpClient:包含有html

    1> baseURL安全

    2> 請求網絡

    3> 操做隊列 NSOperationQueue多線程

 2. 由AFHTTPRequestOperation負責全部的網絡操做請求app

 

0.導入框架準備工做                                

•1. 將框架程序拖拽進項目
 
•2.  添加iOS框架引用
–SystemConfiguration.framework
–MobileCoreServices.framework
 
•3.  引入
#import "AFNetworking.h"
 
//下面用於下載完後解壓

#import "SSZipArchive.h"框架

 

 4. 修改xxx-Prefix.pch文件post

#import <MobileCoreServices/MobileCoreServices.h>優化

#import <SystemConfiguration/SystemConfiguration.h>網站

 

1.AFN的客戶端,使用基本地址初始化,同時會實例化一個操做隊列,以便於後續的多線程處理

複製代碼
 1 #import "ViewController.h"
 2 #import "AFNetworking.h"
 3 #import "SSZipArchive.h"
 4 
 5 @interface ViewController ()
 6 {
 7     // AFN的客戶端,使用基本地址初始化,同時會實例化一個操做隊列,以便於後續的多線程處理
 8     AFHTTPClient    *_httpClient;
 9     
10     // 下載操做
11     AFHTTPRequestOperation *_downloadOperation;
12     
13     NSOperationQueue *_queue;
14 }
15 
//下載進度條顯示 16 @property (weak, nonatomic) IBOutlet UIProgressView *progressView; 17 18 @end 19 20 @implementation ViewController 21 /* 22 關於文件下載,在Documents中保存的文件,必定是要應用程序產生的文件或者數據 23 沒有明顯提示用戶下載到本地的文件不能保存在Docuemnts中! 24 25 26 */ 27 28 - (void)viewDidLoad 29 { 30 [super viewDidLoad]; 31 32 NSURL *url = [NSURL URLWithString:@"http://192.168.3.251/~apple/itcast"]; 33 _httpClient = [[AFHTTPClient alloc] initWithBaseURL:url]; 34 35 _queue = [[NSOperationQueue alloc] init]; 36 }
複製代碼

 

2.利用AFN實現文件下載操做細節        

複製代碼
 1 #pragma mark 下載
 2 - (IBAction)download
 3 {
 4     // 1. 創建請求
 5     NSURLRequest *request = [_httpClient requestWithMethod:@"GET" path:@"download/Objective-C2.0.zip" parameters:nil];
 6     
 7     // 2. 操做
 8     AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
 9     
10     _downloadOperation = op;
11     
12     // 下載
13     // 指定文件保存路徑,將文件保存在沙盒中
14     NSArray *docs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
15     NSString *path = [docs[0] stringByAppendingPathComponent:@"download.zip"];
16     
17     op.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];
18     
19     // 設置下載進程塊代碼
20     /*
21      bytesRead                      當前一次讀取的字節數(100k)
22      totalBytesRead                 已經下載的字節數(4.9M)
23      totalBytesExpectedToRead       文件總大小(5M)
24      */
25     [op setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
26         
27         // 設置進度條的百分比
28         CGFloat precent = (CGFloat)totalBytesRead / totalBytesExpectedToRead;
29         NSLog(@"%f", precent);
30         
31         _progressView.progress = precent;
32     }];
33     
34     // 設置下載完成操做
35     [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
36         
37         // 下載完成以後,解壓縮文件
38         /*
39          參數1:要解結壓縮的文件名及路徑 path - > download.zip
40          參數2:要解壓縮到的位置,目錄    - > document目錄
41          */
42         [SSZipArchive unzipFileAtPath:path toDestination:docs[0]];
43         
44         // 解壓縮以後,將原始的壓縮包刪除
45         // NSFileManager專門用於文件管理操做,能夠刪除,複製,移動文件等操做
46         // 也能夠檢查文件是否存在
47         [[NSFileManager defaultManager] removeItemAtPath:path error:nil];
48         
49         // 下一步能夠進行進一步處理,或者發送通知給用戶。
50         NSLog(@"下載成功");
51     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
52         NSLog(@"下載失敗");
53     }];
54     
55     // 啓動下載
56     [_httpClient.operationQueue addOperation:op];
57  }
複製代碼

 

3.關於暫停和繼續                 

複製代碼
 1 - (IBAction)pauseResume:(id)sender
 2 {
 3     // 關於暫停和繼續,AFN中的數據不是線程安全的
 4     // 若是使用操做的暫停和繼續,會使得數據發生混亂
 5     // 不建議使用此功能。
 6     // 有關暫停和後臺下載的功能,NSURLSession中會介紹。
 7     if (_downloadOperation.isPaused) {
 8         [_downloadOperation resume];
 9     } else {
10         [_downloadOperation pause];
11     }
12 }
複製代碼

 

4.檢測網絡狀態--優化用戶體驗          

複製代碼
 1 #pragma mark 檢測網路狀態
 2 /*
 3  AFNetworkReachabilityStatusUnknown          = -1,  未知
 4  AFNetworkReachabilityStatusNotReachable     = 0,   未鏈接
 5  AFNetworkReachabilityStatusReachableViaWWAN = 1,   3G
 6  AFNetworkReachabilityStatusReachableViaWiFi = 2,   無線鏈接
 7  */
 8 - (IBAction)checkNetwork:(id)sender
 9 {
10     // 1. AFNetwork 是根據是否可以鏈接到baseUrl來判斷網絡鏈接狀態的
11     // 提示:最好使用門戶網站來判斷網絡鏈接狀態。
12     NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
13     
14     AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:url];
15     _httpClient = client;
16     
17     [_httpClient setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
18 
19         // 之因此區分無線和3G主要是爲了替用戶省錢,省流量
20         // 若是應用程序佔流量很大,必定要提示用戶,或者提供專門的設置,僅在無線網絡時使用!
21         switch (status) {
22             case AFNetworkReachabilityStatusReachableViaWiFi:
23                 NSLog(@"無線網絡");
24                 break;
25             case AFNetworkReachabilityStatusReachableViaWWAN:
26                 NSLog(@"3G網絡");
27                 break;
28             case AFNetworkReachabilityStatusNotReachable:
29                 NSLog(@"未鏈接");
30                 break;
31             case AFNetworkReachabilityStatusUnknown:
32                 NSLog(@"未知錯誤");
33                 break;
34         }
35     }];
36 }
相關文章
相關標籤/搜索