AFNetworking是一款在OS X和iOS下都令人喜愛的網(wǎng)絡(luò)庫。AFNetworking適用于iOS以及Mac OS X. 它構(gòu)建于在NSURLConnection, NSOperation, 以及其他熟悉的Foundation技術(shù)之上. 它擁有良好的架構(gòu),豐富的api,以及模塊化構(gòu)建方式,使得使用起來非常輕松。
為了迎合iOS新版本的升級, AFNetworking在3.0版本中刪除了基于 NSURLConnection API的所有支持。如果你的項(xiàng)目以前使用過這些API,建議您立即升級到基于 NSURLSession 的API的AFNetworking的版本。本指南將引導(dǎo)您完成這個(gè)過程。
CORE:
AFURLConnectionOperation:一個(gè) NSOperation 實(shí)現(xiàn)了NSURLConnection 的代理方法.
HTTP Requests:
AFHTTPRequestOperation:AFURLConnectionOperation的子類,當(dāng)request使用的協(xié)議為HTTP和HTTPS時(shí),它壓縮了用于決定request是否成功的狀態(tài)碼和內(nèi)容類型.
AFJSONRequestOperation:AFHTTPRequestOperation的一個(gè)子類,用于下載和處理jason response數(shù)據(jù).
AFXMLRequestOperation:AFHTTPRequestOperation的一個(gè)子類,用于下載和處理xml response數(shù)據(jù).
AFPropertyListRequestOperation:AFHTTPRequestOperation的一個(gè)子類,用于下載和處理property list response數(shù)據(jù).
HTTP CLIENT:
AFHTTPClient:捕獲一個(gè)基于http協(xié)議的網(wǎng)絡(luò)應(yīng)用程序的公共交流模式.包含:
使用基本的url相關(guān)路徑來只做request
為request自動添加設(shè)置http headers.
使用http 基礎(chǔ)證書或者OAuth來驗(yàn)證request
為由client制作的requests管理一個(gè)NSOperationQueue
從NSDictionary生成一個(gè)查詢字符串或http bodies.
從request中構(gòu)建多部件
自動的解析http response數(shù)據(jù)為相應(yīng)的表現(xiàn)數(shù)據(jù)
在網(wǎng)絡(luò)可達(dá)性測試用監(jiān)控和響應(yīng)變化.
IMAGES
AFImageRequestOperation:一個(gè)AFHTTPRequestOperation的子類,用于下載和處理圖片.
UIImageView+AFNetworking:添加一些方法到UIImageView中,為了從一個(gè)URL中異步加載遠(yuǎn)程圖片
AFNetworking使用總結(jié)
1 將AFNetWorking文件夾導(dǎo)入項(xiàng)目
2 添加類庫 Security.framework、MobileCoreServices.framework、SystemConfiguration.framework
3 在使用的地方 #import "AFNetworking.h"
解決編譯時(shí)警告:
Prefix.pch文件中加入 #import <SystemConfiguration/SystemConfiguration.h> #import <MobileCoreServices/MobileCoreServices.h>
注:AFNetWorking使用了ARC ,在不使用ARC項(xiàng)目中使用時(shí),對AFNetWorking的所有.m文件添加“-fobjc-arc”
在使用ARC項(xiàng)目中,使用“不使用ARC”的類庫時(shí),對類庫的.m文件添加“-fno-objc-arc”
AFHTTPRequestOperation 核心代碼
與NSURLConnection對象不同,每個(gè)共享應(yīng)用范圍的設(shè)置如會話管理、緩存策略、Cookie存儲以及URL協(xié)議等,這些NSURLSession對象都可以單獨(dú)進(jìn)行配置。使用特定的配置來初始化會話,它可以發(fā)送任務(wù)來獲取數(shù)據(jù),并上傳或下載文件。
在AFNetworking 2.0中,使用AFHTTPRequestOperation,有可能創(chuàng)建一個(gè)沒有額外開銷的獨(dú)立的網(wǎng)絡(luò)請求來獲取數(shù)據(jù)。NSURLSession則需要更多的開銷,為了獲得所要請求的數(shù)據(jù)。
接下來,將要通過AFHTTPSessionManager創(chuàng)建一個(gè)對象,并創(chuàng)建一個(gè)任務(wù)和啟動它。
iOS- 利用AFNetworking(AFN) - 實(shí)現(xiàn)圖片上傳
官方建議AFN的使用方法
1. 定義一個(gè)全局的AFHttpClient:包含有
1> baseURL
2> 請求
3> 操作隊(duì)列 NSOperationQueue
2. 由AFHTTPRequestOperation負(fù)責(zé)所有的網(wǎng)絡(luò)操作請求
3. 修改xxx-Prefix.pch文件
#import <MobileCoreServices/MobileCoreServices.h>
#import <SystemConfiguration/SystemConfiguration.h>
0.導(dǎo)入框架準(zhǔn)備工作
•1. 將框架程序拖拽進(jìn)項(xiàng)目
•2. 添加iOS框架引用
–SystemConfiguration.framework
–MobileCoreServices.framework
•3. 引入
#import "AFNetworking.h"
1.AFN的客戶端,使用基本地址初始化,同時(shí)會實(shí)例化一個(gè)操作隊(duì)列,以便于后續(xù)的多線程處理
1 @interfaceViewController () 2
3 { 4
5 // AFN的客戶端,使用基本地址初始化,同時(shí)會實(shí)例化一個(gè)操作隊(duì)列,以便于后續(xù)的多線程處理 6
7 AFHTTPClient *_httpClient;17 NSOperationQueue *_queue;18
19 }
1 - (void)viewDidLoad2 {3 [super viewDidLoad];4
5 NSURL *url = [NSURL URLWithString:@"http://192.168.3.255/~apple/qingche"];6 _httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];7
8 _queue = [[NSOperationQueue alloc] init];9 }
2.利用AFN實(shí)現(xiàn)文件上傳操作細(xì)節(jié)
1 #pragma mark - 文件上傳 2 - (IBAction)uploadImage 3 { 4 /*
5 此段代碼如果需要修改,可以調(diào)整的位置
6
7 1. 把upload.php改成網(wǎng)站開發(fā)人員告知的地址
8 2. 把file改成網(wǎng)站開發(fā)人員告知的字段名
9 */10 // 1. httpClient->url11
12 // 2. 上傳請求POST13 NSURLRequest *request = [_httpClient multipartFormRequestWithMethod:@"POST" path:@"upload.php" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {14 // 在此位置生成一個(gè)要上傳的數(shù)據(jù)體15 // form對應(yīng)的是html文件中的表單16
17
18 UIImage *image = [UIImage imageNamed:@"頭像1"];19 NSData *data = UIImagePNGRepresentation(image);20
21 // 在網(wǎng)絡(luò)開發(fā)中,上傳文件時(shí),是文件不允許被覆蓋,文件重名22 // 要解決此問題,23 // 可以在上傳時(shí)使用當(dāng)前的系統(tǒng)事件作為文件名24 NSDateFormatter *formatter = [[NSDateFormatter alloc] init];25 // 設(shè)置時(shí)間格式26 formatter.dateFormat = @"yyyyMMddHHmmss";27 NSString *str = [formatter stringFromDate:[NSDate date]];28 NSString *fileName = [NSString stringWithFormat:@"%@.png", str];29
30
31 /*32 此方法參數(shù)
33 1. 要上傳的[二進(jìn)制數(shù)據(jù)]
34 2. 對應(yīng)網(wǎng)站上[upload.php中]處理文件的[字段"file"]
35 3. 要保存在服務(wù)器上的[文件名]
36 4. 上傳文件的[mimeType]
37 */38 [formData appendPartWithFileData:data name:@"file" fileName:fileName mimeType:@"image/png"];39 }];40
41 // 3. operation包裝的urlconnetion42 AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];43
44 [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {45 NSLog(@"上傳完成");46 } failure:^(AFHTTPRequestOperation *operation, NSError *error) {47 NSLog(@"上傳失敗->%@", error);48 }];49
50 //執(zhí)行51 [_httpClient.operationQueue addOperation:op];