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 }

 

· AFNetworking3.0+ (最新AFN) 版本使用方法能夠看我最新的日誌:atom

iOS- 利用AFNetworking3.0+(最新AFN) - 實現文件斷點下載

                                                       

做者: 清澈Saup

出處: http://www.cnblogs.com/qingche/

本文版權歸做者和博客園共有,歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。

相關文章
相關標籤/搜索