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

–AFNetworking(AFN)
新建項目並導入 AFN 框架 的步驟
•1. 將框架程序拖拽進項目
•2.  添加iOS框架引用
–SystemConfiguration.framework
–MobileCoreServices.framework
•3. 修改xxx-Prefix.pch文件

#import <MobileCoreServices/MobileCoreServices.h>php

#import <SystemConfiguration/SystemConfiguration.h>html

AFN——AFHTTPClientjson

•1. 使用baseURL實例化
•2. 創建NSURLRequest
Ø建立GET、HEAD、PUT、DELETE方法請求
²requestWithMethod:path:parameters:
Ø建立POST方法請求
²multipartFormRequestWithMethod:path:parameters:
constructingBodyWithBlock:

 

•3. 檢測網路鏈接狀態
–setReachabilityStatusChangeBlock
 
AFHttpRequestOperation —— NSURLConnection 的封裝
•AFHttpRequestOperation  HTTP請求操做
ØAFJSONRequestOperation  對JSON請求的封裝
ØAFXMLRequestOperation  對XML請求的封裝
ØAFPropertyListRequestOperation  對Plist請求的封裝
ØAFImageRequestOperation  對圖像請求的封裝
Ø
•塊代碼操做
ØsetCompletionBlockWithSuccess  設置請求完成塊代碼
ØsetUploadProgressBlock  設置上傳進度塊代碼
ØsetDownloadProgressBlock  設置下載進度塊代碼
•下載操做須要設置outputStream
Ø針對請求的操做pause(暫停)resume(繼續)

// 關於暫停和繼續,AFN中的數據不是線程安全的安全

    // 若是使用操做的暫停和繼續,會使得數據發生混亂服務器

    // 不建議使用此功能。網絡

    // 有關暫停和後臺下載的功能,NSURLSession中會介紹。多線程

    if (_downloadOperation.isPaused) {app

        [_downloadOperationresume];框架

    } else {ide

        [_downloadOperationpause];

    }

 

檢測網絡鏈接狀態
 AFNetworkReachabilityStatusUnknown           = -1,   未知

 AFNetworkReachabilityStatusNotReachable     = 0,   未鏈接

 AFNetworkReachabilityStatusReachableViaWWAN = 1,   3G

 AFNetworkReachabilityStatusReachableViaWiFi = 2,   無線鏈接

// 1. AFNetwork 是根據是否可以鏈接到baseUrl來判斷網絡鏈接狀態的

    // 提示:最好使用門戶網站來判斷網絡鏈接狀態。

    NSURL *url = [NSURLURLWithString:@"http://www.baidu.com"];

    

    AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:url];

    _httpClient = client;

    

    [_httpClientsetReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

 

        // 之因此區分無線和3G主要是爲了替用戶省錢,省流量

        // 若是應用程序佔流量很大,必定要提示用戶,或者提供專門的設置,僅在無線網絡時使用!

        switch (status) {

            caseAFNetworkReachabilityStatusReachableViaWiFi:

                NSLog(@"無線網絡");

                break;

            caseAFNetworkReachabilityStatusReachableViaWWAN:

                NSLog(@"3G網絡");

                break;

            caseAFNetworkReachabilityStatusNotReachable:

                NSLog(@"未鏈接");

                break;

            caseAFNetworkReachabilityStatusUnknown:

                NSLog(@"未知錯誤");

                break;

        }

 

    }];

 

 

加載JSON 

官方建議AFN的使用方法

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

    1> baseURL

    2> 請求

    3> 操做隊列 NSOperationQueue

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

// 1. NSURLRequest

    NSURLRequest *request = [_httpClientrequestWithMethod:@"GET"path:@"videos.php?format=json"parameters:nil];

    

    // 2. 鏈接

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

        

        // 成功以後,直接使用反序列化出來的結果便可。

        NSLog(@"%@", JSON);

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

        // 1> 網絡訪問獲取數據出錯

        // 2> JSON的反序列化出錯

        

        NSLog(@"%@ %@", error, JSON);

    }];

    

    // 3. 將操做添加到隊列,開始多線程操做

    // 將操做添加到隊列或者start,操做就會啓動

    [_httpClient.operationQueueaddOperation:op];

//    [_queue addOperation:op];

 

//    [op start];

 

上傳圖像

  /*

     此段代碼若是須要修改,能夠調整的位置

     

     1. upload.php改爲網站開發人員告知的地址

     2. file改爲網站開發人員告知的字段名

     */

    // 1. httpClient->url

    

    // 2. 上傳請求POST

    NSURLRequest *request = [_httpClientmultipartFormRequestWithMethod:@"POST"path:@"upload.php"parameters:nilconstructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

        // 在此位置生成一個要上傳的數據體

        // form對應的是html文件中的表單

        /*

         參數

         1. 要上傳的[二進制數據]

         2. 對應網站上[upload.php]處理文件的[字段"file"]

         3. 要保存在服務器上的[文件名]

         4. 上傳文件的[mimeType]

         */

        UIImage *image = [UIImage imageNamed:@"頭像1"];

        NSData *data = UIImagePNGRepresentation(image);

        

        // 在網絡開發中,上傳文件時,是文件不容許被覆蓋,文件重名

        // 要解決此問題,

        // 能夠在上傳時使用當前的系統事件做爲文件名

        NSDateFormatter *formatter = [[NSDateFormatteralloc] init];

        // 設置時間格式

        formatter.dateFormat = @"yyyyMMddHHmmss";

        NSString *str = [formatter stringFromDate:[NSDate date]];

        NSString *fileName = [NSString stringWithFormat:@"%@.png", str];

        

        [formData appendPartWithFileData:data name:@"file"fileName:fileName mimeType:@"image/png"];

    }];

    

    // 3. operation包裝的urlconnetion

    AFHTTPRequestOperation *op = [[AFHTTPRequestOperationalloc] initWithRequest:request];

    

    [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

        NSLog(@"上傳完成");

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        NSLog(@"上傳失敗->%@", error);

    }];

    

    

    [_httpClient.operationQueueaddOperation:op];

 

——斷點續傳

•設置操做的輸出流(在網絡中的數據是流的方式傳輸)
•[operation setOutputStream:[NSOutputStream outputStreamToFileAtPath:downloadPath append:YES]];
 

下載

    // 1. 創建請求

    NSURLRequest *request = [_httpClientrequestWithMethod:@"GET"path:@"download/Objective-C2.0.zip"parameters:nil];

    

    // 2. 操做

    AFHTTPRequestOperation *op = [[AFHTTPRequestOperationalloc] initWithRequest:request];

    

    _downloadOperation = op;

    

    // 下載

    // 指定文件保存路徑,將文件保存在沙盒中

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

    NSString *path = [docs[0] stringByAppendingPathComponent:@"download.zip"];

    

    op.outputStream = [NSOutputStreamoutputStreamToFileAtPath:path append:NO];

    

    // 設置下載進程塊代碼

    /*

     bytesRead                      當前一次讀取的字節數(100k)

     totalBytesRead                 已經下載的字節數(4.9M

     totalBytesExpectedToRead       文件總大小(5M)

     */

    [op setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {

        

        // 設置進度條的百分比

        CGFloat precent = (CGFloat)totalBytesRead / totalBytesExpectedToRead;

        NSLog(@"%f", precent);

        

        _progressView.progress = precent;

    }];

    

    // 設置下載完成操做

    [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

        

        // 下載完成以後,解壓縮文件

        /*

         參數1:要解結壓縮的文件名及路徑 path - > download.zip

         參數2:要解壓縮到的位置,目錄    - > document目錄

         */

        [SSZipArchiveunzipFileAtPath:path toDestination:docs[0]];

        

        // 解壓縮以後,將原始的壓縮包刪除

        // NSFileManager專門用於文件管理操做,能夠刪除,複製,移動文件等操做

        // 也能夠檢查文件是否存在

        [[NSFileManagerdefaultManager] removeItemAtPath:path error:nil];

        

        // 下一步能夠進行進一步處理,或者發送通知給用戶。

        NSLog(@"下載成功");

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        NSLog(@"下載失敗");

    }];

    

    // 啓動下載

    [_httpClient.operationQueueaddOperation:op];

相關文章
相關標籤/搜索