AFNetworking
什么是AFN
全称是AFNetworking,是对NSURLConnection的一层封装
虽然运行效率没有ASI高,但是使用比ASI简单
在iOS开发中,使用比较广泛
- AFN的github地址 https://github.com/pokeb/AFNetworking/AFNetworking
AFN的版本选择
AFHTTPSessionManager
AFHTTPSessionManager
是AFN中最重要的对象之一 封装了HTTP请求的常见处理 GET\POST请求 解析服务器的响应数据
创建
AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
GET\POST请求
- GET请求
-(NSURLSessionDataTask *)GET:(NSString *)URLString parameters:(id)parameters success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
- POST请求
-(NSURLSessionDataTask *)POST:(NSString *)URLString parameters:(id)parameters success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
文件上传
- (NSURLSessionDataTask *)POST:(NSString *)URLString
parameters:(id)parameters
constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
监控联网状态
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
[manager startMonitoring];
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"%d", status);
}];
提示:要监控网络连接状态,必须要先调用单例的startMonitoring方法
简单使用
get请求
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
NSDictionary * parameters = @{
@"username": @"520it",
@"pwd" : @"520it"
};
[manager GET:@"http://120.25.226.186:32812/login" parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@",error);
}];
文件上传
文件上传写到block里面,需要设置mimeType名等,参数需要写到外面
- (void)upload {
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
[manager POST:@"http://120.25.226.186:32812/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
// 上传多个文件,就写多次就好
NSData * data;
// 在这个block中设置需要上传的文件
// name:参数名
// fileName:文件名(服务器端会接收文件名)
// mimeType:类型
// [formData appendPartWithFileData:data name:@"file" fileName:@"test.png" mimeType:@"image/png"];
// [formData appendPartWithFileURL:[NSURL fileURLWithPath:<#(nonnull NSString *)#>] name:<#(nonnull NSString *)#> fileName:<#(nonnull NSString *)#> mimeType:<#(nonnull NSString *)#> error:<#(NSError *__autoreleasing _Nullable * _Nullable)#>]
// 文件名直接为获取当前文件目录的lastPathComponent
// [formData appendPartWithFileURL:[NSURL fileURLWithPath:<#(nonnull NSString *)#>] name:<#(nonnull NSString *)#> error:<#(NSError *__autoreleasing _Nullable * _Nullable)#>]
} progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@",error);
}];
}
返回数据为XML
- (void)xml {
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
// 专门用来解析服务器返回数据,默认为JSON解析
// 告诉AFN,以XML形式解析服务器返回的数据
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
NSDictionary * parameters = @{
@"username": @"520it",
@"pwd" : @"520it",
@"type" : @"XML"
};
[manager GET:@"http://120.25.226.186:32812/login" parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@",error);
}];
}
返回服务器原本数据(例如是图片,返回为data)
- (void)get {
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
// 专门用来解析服务器返回数据,默认为JSON解析
// 直接使用“服务器本来返回的数据”,不做任何解析
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// [AFJSONResponseSerializer serializer]; // 解析服务器返回的JSON数据
// [AFXMLParserResponseSerializer serializer]; // 解析服务器返回的XML数据
NSDictionary * parameters = @{
@"username": @"520it",
@"pwd" : @"520it",
@"type" : @"XML"
};
[manager GET:@"http://120.25.226.186:32812/login" parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@",error);
}];
}
网络监控
// 开始监控网络状态
AFNetworkReachabilityManager * manager = [AFNetworkReachabilityManager sharedManager];
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"当前的网络状态");
}];
[manager startMonitoring];
苹果自带
检测网络状态
在网络应用中,需要对用户设备的网络状态进行实时监控,目的是
- 让用户了解自己的网络状态,防止一些误会(比如怪应用无能)
- 根据用户的网络状态进行智能处理,节省用户流量,提高用户体验
- WIFI\3G网络:自动下载高清图片
- 低速网络:只下载缩略图
- 没有网络:只显示离线的缓存数据
苹果官方提供了一个叫Reachability的示例程序,便于开发者检测网络状态 Reachability
Reachability
常见用法
// 是否WIFI
+ (BOOL) IsEnableWIFI {
return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);
}
// 是否3G
+ (BOOL) IsEnable3G {
return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);
}
网络监控
- (void)appleMonitoring
{
// 监听通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getNetworkStatus) name:kReachabilityChangedNotification object:nil];
// 开始监控网络
self.reachability = [Reachability reachabilityForInternetConnection];
[self.reachability startNotifier];
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[self.reachability stopNotifier];
self.reachability = nil;
}
- (void)getNetworkStatus
{
if ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus != NotReachable) {
NSLog(@"是wifi");
} else if ([Reachability reachabilityForInternetConnection].currentReachabilityStatus != NotReachable) {
NSLog(@"是手机自带网络");
} else {
NSLog(@"网络有问题");
}
}}
// 这个不是监控,只是检测用,例如当启动的时候判断网路状态。(主动获取)
if ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus != NotReachable) {
NSLog(@"是wifi");
} else if ([Reachability reachabilityForInternetConnection].currentReachabilityStatus != NotReachable) {
NSLog(@"是手机自带网络");
} else {
NSLog(@"网络有问题");
}