AFN內部結構
- AFN結構體
- NSURLConnection
- AFURLConnectionOperation
- AFHTTPRequestOperation
- AFHTTPRequestOperationManager(封裝了常用的 HTTP 方法)
- 屬性
- baseURL :AFN建議開發(fā)者針對 AFHTTPRequestOperationManager 自定義個一個單例子類,設置 baseURL, 所有的網絡訪問,都只使用相對路徑即可
- requestSerializer :請求數據格式/默認是二進制的 HTTP
- responseSerializer :響應的數據格式/默認是 JSON 格式
- operationQueue
- reachabilityManager :網絡連接管理器
- 方法
- manager :方便創(chuàng)建管理器的類方法
- HTTPRequestOperationWithRequest :在訪問服務器時,如果要告訴服務器一些附加信息,都需要在 Request 中設置
- GET
- POST
- NSURLSession
- AFURLSessionManager
- AFHTTPSessionManager(封裝了常用的 HTTP 方法)
- GET
- POST
- UIKit + AFNetworking 分類
- NSProgress :利用KVO
- 半自動的序列化&反序列化的功能
- AFURLRequestSerialization :請求的數據格式/默認是二進制的
- AFURLResponseSerialization :響應的數據格式/默認是JSON格式
- 附加功能
- 安全策略
- 網絡檢測
- 對蘋果的網絡連接檢測做了一個封裝
- AFNetworkReachabilityManager
2. AFN的基本使用
- 發(fā)送GET請求的兩種方式(POST同)
-(void)get1{
//1.創(chuàng)建AFHTTPRequestOperationManager管理者
//AFHTTPRequestOperationManager內部是基于NSURLConnection實現的
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//2.發(fā)送請求
/*
http://120.25.226.186:32812/login?username=ee&pwd=ee&type=JSON
第一個參數:NSString類型的請求路徑,AFN內部會自動將該路徑包裝為一個url并創(chuàng)建請求對象
第二個參數:請求參數,以字典的方式傳遞,AFN內部會判斷當前是POST請求還是GET請求,以選擇直接拼接還是轉換為NSData放到請求體中傳遞
第三個參數:請求成功之后回調Block
第四個參數:請求失敗回調Block
*/
NSDictionary *param = @{ @"username":@"520it",
@"pwd":@"520it"
};
//注意:字符串中不能包含空格
[manager GET:@"url字符串" parameters:param success:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) {
NSLog(@"請求成功---%@",responseObject);
} failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) {
NSLog(@"失敗---%@",error);
}];
}
-(void)get2{
//1.創(chuàng)建AFHTTPSessionManager管理者
//AFHTTPSessionManager內部是基于NSURLSession實現的
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//2.發(fā)送請求
NSDictionary *param = @{ @"username":@"520it",
@"pwd":@"520it"
};
//注意:responseObject:請求成功返回的響應結果(AFN內部已經把響應體轉換為OC對象,通常是字典或數組)
[manager GET:@"url字符串" parameters:param success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) {
NSLog(@"請求成功---%@",[responseObject class]);
} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
NSLog(@"失敗---%@",error);
}];
}
- 使用AFN下載文件
-(void)download{
//1.創(chuàng)建一個管理者
AFHTTPSessionManager *manage = [AFHTTPSessionManager manager];
//2.下載文件
/*
第一個參數:請求對象
第二個參數:下載進度
第三個參數:block回調,需要返回一個url地址,用來告訴AFN下載文件的目標地址
targetPath:AFN內部下載文件存儲的地址,tmp文件夾下
response:請求的響應頭
返回值:文件應該剪切到什么地方
第四個參數:block回調,當文件下載完成之后調用
response:響應頭
filePath:文件存儲在沙盒的地址 == 第三個參數中block的返回值
error:錯誤信息
*/
//2.1 創(chuàng)建請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"url字符串"]];
//2.2 創(chuàng)建下載進度,并監(jiān)聽
NSProgress *progress = nil;
NSURLSessionDownloadTask *downloadTask = [manage downloadTaskWithRequest:request progress:&progress destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
//拼接文件全路徑
NSString *fullpath = [caches stringByAppendingPathComponent:response.suggestedFilename];
NSURL *filePathUrl = [NSURL fileURLWithPath:fullpath];
return filePathUrl;
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nonnull filePath, NSError * _Nonnull error) {
NSLog(@"文件下載完畢---%@",filePath);
}];
//2.3 使用KVO監(jiān)聽下載進度
[progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil];
//3.啟動任務 [downloadTask resume];
}
//獲取并計算當前文件的下載進度
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(NSProgress *)progress change:(NSDictionary<NSString *,id> *)change context:(void *)context{
NSLog(@"%zd--%zd--%f",progress.completedUnitCount,progress.totalUnitCount,1.0 * progress.completedUnitCount/progress.totalUnitCount);
}
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者