AFN作為網(wǎng)絡(luò)處理第三方的老大地位,我就不贅述了,直接說使用,以下是所包含的四個類。
- AFHTTPSessionManager管理者發(fā)送請求
- AFNetworkReachabilityManager網(wǎng)絡(luò)監(jiān)測
- ADSecurityPlicyhttps
- AFURLResponseSeralization
==演示==
AFN中的get和post請求 - get請求
//創(chuàng)建請求
AFHTTPSessionManger *manger = [AFHTTPSession manger];
//修改block的線程
manager.completionQueue = dispatch_get_global_queue;
NSDictionary *parma = @{@"name":@"xiaoxinxin",@"age":@18};
//發(fā)送請求
manager GET:@"" parameters:nil progress:nil success:^{
//默認(rèn)在主線程執(zhí)行
NSLog(@"%@",[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]);
}fileure^{
NSLog(@"%@",[error localizedDescription]);
}
==使用注意==
* AFN發(fā)送的所有請求都是異步,不會阻塞主線程
* 默認(rèn)情況下是JSON解析
* block代碼塊內(nèi)容是在get和post請求完成之后才執(zhí)行
* block默認(rèn)在主線程執(zhí)行,如果希望修改代碼塊在子線程執(zhí)行如下修改
manager.completionQueue = dispatch_get_global_queue;
-
post請求
- (void)postDemo { //創(chuàng)建管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; //更改執(zhí)行的線程 manager.completionQueue = dispatch_get_global_queue(0, 0); //更改默認(rèn)請求的發(fā)送請求的二進(jìn)制數(shù)據(jù)為JSON格式的二進(jìn)制更改默 認(rèn)的序列化方式 manager.requestSerializer = [AFJSONRequestSerializer serializer]; //更改響應(yīng)默認(rèn)的解析方式為字符串解析 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; //參數(shù) NSDictionary *parma = @{@"name":@"xiaoxinxin,@"age":@18}; //發(fā)送數(shù)據(jù) [manager POST:@"http://192.168.23.7/post/postjson.php" parameters:parma progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id_Nullable responseObject) { //默認(rèn)在主線程執(zhí)行 NSLog(@"%@",[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _ Nonnull error) { NSLog(@"%@",[error localizedDescription]); }];
}
**請求的序列化和反序列化**
* AFN可以把OC對象轉(zhuǎn)成三種方式的二進(jìn)制,請求的普通二進(jìn)制(默認(rèn)的)
* 解析二進(jìn)制默認(rèn)是JSON
==AFN的BaseURL==
* 區(qū)分測試模式和正式模式
** AFN文件上傳與網(wǎng)絡(luò)監(jiān)測 **
* 網(wǎng)絡(luò)監(jiān)測
//檢測網(wǎng)絡(luò)狀態(tài)
- (void)reachAbility {
//創(chuàng)建一個單例manager
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
//監(jiān)測網(wǎng)絡(luò)狀態(tài)改變
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"沒有網(wǎng)絡(luò)");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"連接到路由器網(wǎng)絡(luò)不能到達(dá)");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"2G/3G/4G");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"wifi");
break;
}
}];
//開啟檢測
[manager startMonitoring];
}
**上傳圖片案例演示**[向服務(wù)器上傳多張圖片的工具類](https://github.com/giveMeHug)
- (IBAction)selectPhotos:(id)sender {
//創(chuàng)建圖片多選控制器
ZLPhotoPickerViewController *pickerVc = [[ZLPhotoPickerViewController alloc] init];
//默認(rèn)顯示相冊里面的內(nèi)容SavePhotos
pickerVc.status = PickerViewShowStatusSavePhotos;
//選擇圖片的最小數(shù),默認(rèn)是9張圖片最大也是9張
pickerVc.maxCount = 4;
[self presentViewController:pickerVc animated:YES completion:nil];
// block回調(diào)或者代理
//用block來代替代理
__weak typeof(self) weakSelf = self;
pickerVc.callBack = ^(NSArray *assets){
for (ZLPhotoAssets *photoAsset in assets) {
//將圖片改成二進(jìn)制
NSData *data = UIImagePNGRepresentation(photoAsset.originImage);
//給圖片起名字
NSString *filename = [NSString stringWithFormat:@"%d.png",arc4random_uniform(100)];
//保存圖片到字典中
[weakSelf.fileDict setObject:data forKey:filename];
}
};
} - (IBAction)uploadFile:(id)sender {
//創(chuàng)建一個管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//需要傳入的參數(shù)
NSDictionary *parma = @{
@"status":@"upload succees"
};
//修改默認(rèn)的二進(jìn)制的傳輸類型為JSON格式的二進(jìn)制
manager.requestSerializer = [AFJSONRequestSerializer serializer];
//發(fā)送請求
[manager POST:@"http://192.168.23.7/post/upload-m.php" parameters:parma constructingBodyWithBlock:^(id_Nonnull formData) {
//遍歷字典formdata包括請求體拼接
[self.fileDict enumerateKeysAndObjectsUsingBlock:^(NSString *saveFiledname,NSData *imageData, BOOL * _Nonnull stop) {
//拼接文件參數(shù)拼接在formdata后面
//第一個參數(shù):文件的二進(jìn)制
//第二個參數(shù):后臺接收的字段名userfile[]
/第三個參數(shù):保存起來的名字saveFileName
[formData appendPartWithFileData:imageData name:@"userfile[]" fileName:saveFiledname mimeType:@"image/png"];
}];
} success:^(NSURLSessionDataTask * _Nonnull task, id_Nullable responseObject) {
//打印服務(wù)器返回的參數(shù)
NSLog(@"%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
//打印錯誤信息
NSLog(@"%@",[error localizedDescription]);
}];
}
AFN上傳數(shù)據(jù)的方法appendPartWithFileData:
- (void)appendPartWithFileData:(NSData *)data
name:(NSString *)name
fileName:(NSString *)fileName
mimeType:(NSString *)mimeType;
//參數(shù)1:fileData:需要上傳的文件的二進(jìn)制,如果是多文件,fileData指的是每一個文件的二進(jìn)制
//參數(shù)2:name:服務(wù)器用來接收傳入數(shù)據(jù)的字段名
//參數(shù)3:保存到服務(wù)器上的名字
//參數(shù):標(biāo)記上傳的數(shù)據(jù)的格式如image/png