iOS基礎 - 第三方網絡框架

1、iOS網絡層次結構

基於iOS提供API實現上傳文件和斷點續傳的思路php

經常使用iOS第三方網路框架簡介git

AFNetworkingAFNgithub

ASIHTTPRequestASI編程

另一個經常使用框架數組

SSZipArchive緩存

2、iOS網絡編程層次結構

Cocoa層(NSURLBonjourGame KitWebKit服務器

Core Foundation層(基於 的 CFNetwork 和 CFNetServices網絡

OS層(基於 的 BSD socket數據結構

3、iOS網絡編程層次結構概述

Cocoa層:是最上層的基於OCAPI,好比URL訪問,NSStreamBonjourGameKit等,這是大多數狀況下咱們經常使用的 APICocoa層是基於Core Foundation實現的併發

Core Foundation層:基於C語言的框架,由於直接使用socket須要更多的編程工做,因此蘋果對OS層的socket進行簡單的封裝以簡化編程任務。該層提供了CFNetworkCFNetServices,其中CFNetwork又是基於CFStreamCFSocket

OS層:最底層的BSD socket提供了對網絡編程最大程度的控制,可是編程工做也是最多的。蘋果建議咱們使用Core Foundation及以上層的API進行編程。BSDUNIX系統中通用的網絡接口,它不只支持各類不一樣的網絡類型,並且也是一種內部進程之間的通訊機制

4、AFN vs ASI

AFN

官方推薦的使用方法:爲一系列相關的請求定義一個HTTPClient,共用一個BaseURL。每次請求把URL中除BaseURLPath部分作爲參數傳給HTTPClient的靜態方法,並註冊一個Block用於回調

基於NSURL,性能和穩定性略差

AFN只封裝了一些經常使用功能,知足基本需求,而直接忽略了不少擴展功能

針對JSONXMLPListImage四種數據結構封裝了各自處理器,開發者能夠把處理器註冊到操做隊列中,直接在回調方法中得到格式化之後的數據

ASI

推薦使用方法:每個請求都由構造方法初始化一個(共享)實例,經過這個實例配置參數併發起請求。ASI最初使用delegate模式回調,在iOS SDK支持Block以後也提供了註冊Block的實例方法(注:ASIBlock不易使用)

基於CFNetwork,性能和穩定性略高

ASI的擴展功能很是豐富

ASI沒有針對任何數據類型作特別封裝,只是預留了各類接口和工具供開發者自行擴展

5、AFNASI的選擇

AFN適合邏輯簡單的應用,或者更適合開發資源尚不豐富的團隊,由於AFN的易用性要比ASI好不少,而這樣的應用(或團隊)對底層網絡控件的定製化要求也很是低。

ASI更適合已經發展了一段時間的應用,或者開發資源相對豐富的團隊,由於每每這些團隊(或他們的應用)已經積累了必定的經驗,不管是產品上仍是技術上的。需求複雜度就是在這種時候高起來,並且底層訂製的需求也愈來愈多,此時AFN就很難知足需求,須要犧牲必定的易用性,使用ASI做爲網絡底層控件。

6、AFNetworkingAFN

下載地址

https://github.com/AFNetworking/AFNetworking

AFNetworking官網地址:

http://afnetworking.com

7、導入AFN框架的步驟

1. 將框架程序拖拽進項目

2.  添加iOS框架引用

SystemConfiguration.framework

MobileCoreServices.framework

3. 修改xxx-Prefix.pch文件

#import <MobileCoreServices/MobileCoreServices.h>

#import <SystemConfiguration/SystemConfiguration.h>

8、AFHTTPClient

1. 創建NSURLRequest

建立GETHEADPUTDELETE方法請求

requestWithMethod:path:parameters:

建立POST方法請求

multipartFormRequestWithMethod:path:parameters: constructingBodyWithBlock:

2. 檢測網路鏈接狀態

setReachabilityStatusChangeBlock

9、AFHttpRequestOperationNSURLConnection的封裝

AFHttpRequestOperation HTTP請求操做

AFJSONRequestOperation 對JSON請求的封裝

AFXMLRequestOperation 對XML請求的封裝

AFPropertyListRequestOperation 對Plist請求的封裝

AFImageRequestOperation 對圖像請求的封裝

塊代碼操做

setCompletionBlockWithSuccess 設置請求完成塊代碼

setUploadProgressBlock 設置上傳進度塊代碼

setDownloadProgressBlock 設置下載進度塊代碼

下載操做須要設置outputStream

針對請求的操做pause(暫停)resume(繼續)

10、檢測網絡鏈接狀態

AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://www.baidu.com"]];

[client setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

}];

11、加載JSON & XML

AFJSONRequestOperation *op = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

    NSLog(@"%@", JSON);

} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {

    NSLog(@"%@", JSON);

}];

12、上傳圖像

NSURLRequest *request = [client multipartFormRequestWithMethod:@"POST" path:@"/~liufan9/itcast/upload.php" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

    [formData appendPartWithFileData:imageData name:@"file" fileName:@"update.png" mimeType:@"image/png"];

}];

// 定義操做

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request];

// 設置上傳

// 設置下載進度

十3、解壓縮——另外一個第三方框架SSZipArchive

下載地址:https://github.com/samsoffes/ssziparchive

注意:須要引入libz.dylib框架 

// Unzipping

NSString *zipPath = @"path_to_your_zip_file";

NSString *destinationPath = @"path_to_the_folder_where_you_want_it_unzipped";

[SSZipArchive unzipFileAtPath:zipPath toDestination:destinationPath];

// Zipping

NSString *zippedPath = @"path_where_you_want_the_file_created";

NSArray *inputPaths = [NSArray arrayWithObjects:

                       [[NSBundle mainBundle] pathForResource:@"photo1" ofType:@"jpg"],

                       [[NSBundle mainBundle] pathForResource:@"photo2" ofType:@"jpg"]

                       nil];

[SSZipArchive createZipFileAtPath:zippedPath withFilesAtPaths:inputPaths];

十4、ASIHTTPRequestASI

使用ASI的兩點注意事項

ASI框架是不支持ARC

ASI框架是基於iOS5.0的,若是選擇iOS6.0會有一些蘋果官方再也不維護的方法

十5、ASI下載文件的準備工做

// 1. 指定下載文件地址

NSString *string = @"http://localhost/~liufan9/itcast/download/iTunesConnect_DeveloperGuide_CN.zip";

NSURL *url = [NSURL URLWithString:string];

// 2. 設定文件保存路徑及緩存路徑

NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *downloadPath = [documents[0]stringByAppendingPathComponent:@"book.zip"];

NSString *tempPath = [documents[0]stringByAppendingPathComponent:@"book.tmp"];

十6、ASI 下載文件請求定義部分代碼

// 3. 建立ASIHTTPRequest

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

// 4. 設置代理——ASI是經過代理回調的方式處理網絡請求的

[request setDelegate:self];

// 5. 設置下載路徑

[request setDownloadDestinationPath:downloadPath];

// 6. 設置緩存路徑

[request setTemporaryFileDownloadPath:tempPath];

// 7. 設置斷點續傳

[request setAllowResumeForFileDownloads:YES];

// 8. 設置下載進程代理

[request setDownloadProgressDelegate:self];

// 9. 啓動異步請求——用戶想知道下載的實際進展狀況

[request start];

十7、NSURLConnectionDataDelegate的代理方法

// 服務器開始返回數據

(void)connection:didReceiveResponse:

// 收到服務器返回的數據,本方法會被調用屢次

- (void)connection:didReceiveData:

// 數據接收完畢

(void)connectionDidFinishLoading:

// 網絡鏈接錯誤

- (void)connection:didFailWithError:

// 發送數據給服務器,POST 請求使用此方法

- (void)connection:didSendBodyData:totalBytesWritten: totalBytesExpectedToWrite:

十8、ASIRequest 代理方法

// 請求開始

- (void)requestStarted:(ASIHTTPRequest *)request

// 請求接收到響應的頭部,包括文件大小信息

- (void)request:(ASIHTTPRequest *)request didReceiveResponseHeaders:(NSDictionary *)responseHeaders

// 請求完成

- (void)requestFinished:(ASIHTTPRequest *)request

// 請求失敗

- (void)requestFailed:(ASIHTTPRequest *)request

對比結果:

ASIRequest不須要處理中間數據

可是請求開始拆分紅了兩部分

十9、實現代理方法以前須要先聽從代理協議

 

ASIHTTPRequestDelegate

ASIProgressDelegate

二10、第三方框架SSZipArchive解壓縮

下載地址:https://github.com/samsoffes/ssziparchive

注意:須要引入libz.dylib框架 

// Unzipping

NSString *zipPath = @"path_to_your_zip_file";

NSString *destinationPath = @"path_to_the_folder_where_you_want_it_unzipped";

[SSZipArchive unzipFileAtPath:zipPath toDestination:destinationPath];

// Zipping

NSString *zippedPath = @"path_where_you_want_the_file_created";

NSArray *inputPaths = [NSArray arrayWithObjects:

                       [[NSBundle mainBundle] pathForResource:@"photo1" ofType:@"jpg"],

                       [[NSBundle mainBundle] pathForResource:@"photo2" ofType:@"jpg"]

                       nil];

[SSZipArchive createZipFileAtPath:zippedPath withFilesAtPaths:inputPaths];

 

NSLog(@"請求完成");

// 需求:

// 1. 知道文件保存路徑(運行,發現文件已經下載完成了)

// 2. 解壓縮文件(導入SSZipArchive框架)

// 根據SSZipArchive框架用法寫思路

// 2.1 設置壓縮文件路徑

NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *downloadPath = [documents[0]stringByAppendingPathComponent:@"book.zip"];

// 2.2 設置解壓縮文件路徑,保存在當前路徑

NSString *unzipPath = documents[0];

// 2.3 解壓縮

[SSZipArchive unzipFileAtPath:downloadPath toDestination:unzipPath];

 

// 3. 刪除壓縮文件

[[NSFileManager defaultManager]removeItemAtPath:downloadPath error:nil];

二11、ASIProgressDelegate下載進度跟蹤

ASIProgressDelegate——setProgress

#pragma mark - 下載進度代理方法

- (void)setProgress:(float)newProgress

{

    // 經過Log發現傳入的是一個百分比的數組

          // 如今須要一個文件大小,並提示用戶文件的大小

      NSLog(@"%f", newProgress);

}

二12、ASIRequest響應頭部的代碼實現

1. ASIRequest響應頭部的代碼實現

// 1. NSLOG看看頭部是什麼內容

NSLog(@"%@", responseHeaders);

// 2. 發現其中有一個"Content-Length" = 6105204;

// 貌似是和文件下載進度有關的工做能夠在這裏進行

// 將文件大小轉換成M爲單位 字節-K-M

_fileLength = request.contentLength / 1024.0 / 1024.0;

NSLog(@"%.2fM", _fileLength);

2. setProgress方法

NSLog(@"%.2f", newProgress * _fileLength);

相關文章
相關標籤/搜索