iOS开发网络篇 一一 AFN序列化、监测网络状态

一、AFN序列化

知识点:

1. 服务器默认返回的数据是 JSON的数据

2. 如果请求类型是XML的,服务器应该返回给我们的也是XML数据.

因此要修改AFN的解决方案:

manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
3. 既不是JSON也不是XML:

manager.responseSerializer = [AFHTTPResponseSerializer serializer];
4. 如果请求的是一个网页,需要设置返回类型为 text/html

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

#import "ViewController.h"
#import "AFNetworking.h"

@interface ViewController ()<NSXMLParserDelegate>
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self httpData2];
}

- (void)json
{
    //1. 创建会话管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    NSDictionary *dict = @{
                           @"username" : @"zy",
                           @"pwd" : @"zy",
                           @"type" : @"JSON"
                           };
    
    //2. 发送GET请求
    /*
     param1:请求路径(不包含参数)
     param2:字典(发送给服务器的数据~参数)
     param3:progress 进度回调
     param4:success 成功回调
     task:请求任务
     responseObject:响应体信息(JSON-->OC对象)
     param5:failure 失败回调
     error: 错误信息
     响应头: task.response
     */
    [manager GET:@"http://localhost:8080/MJServer/login" parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        //注意: 默认返回的JSON数据
        NSLog(@"%@---%@",[responseObject class],responseObject);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"请求失败--%@",error);
    }];
}

// 返回的是XML
- (void)xml
{
    //1. 创建会话管理者
    AFHTTPSessionManager *manager= [AFHTTPSessionManager manager];
    
    // 注意:如果返回的是XML数据,那么应该修改AFN的解决方案
    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
    
    NSDictionary *paramDict = @{
                                @"type":@"XML"
                                };
    //2. 发送GET请求
    [manager GET:@"http://localhost:8080/MJServer/video" parameters:paramDict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        NSXMLParser *parser = (NSXMLParser *)responseObject;
        // 设置代理
        parser.delegate = self;
        // 开始解析
        [parser parse];
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"请求失败--%@",error);
    }];
}

// 既不是JSON 也 不是XML
- (void)httpData
{
    //1. 创建会话者对象
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    // 注意: 如果返回的是xml数据,那么应该修改AFN解决方案:AFXMLParserResponseSerializer
    // 如果返回的不是 xml,json数据. 那么应该修改AFN解决方案:
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    //2. 发送GET请求
    [manager GET:@"http://120.25.226.186:32812/resources/images/minion_01.png" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        NSLog(@"%@-",[responseObject class]);
//        UIImage *image = [UIImage imageWithData:responseObject];
//        self.imageView.image = image;
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"请求失败--%@",error);
    }];
}

- (void)httpData2
{
    //1. 创建会话者对象
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    // 注意: 如果返回的是xml数据,那么应该修改AFN解决方案:AFXMLParserResponseSerializer
    // 如果返回的不是 xml,json数据. 那么应该修改AFN解决方案:
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
    
    //2. 发送GET请求
    [manager GET:@"http://www.baidu.com" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        NSLog(@"%@-%@",[responseObject class],[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"请求失败--%@",error);
    }];
}

#pragma -mark NSXMLParserDelegate
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
    NSLog(@"%@--%@",elementName,attributeDict);
}

@end


二、AFN监测网络状态改变 / 系统监测网络状态改变

知识点:

1. 需要获得一个网络状态监测管理者

AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
这个方法是一个单例方法. 需要 调用 startMonitoring 方法,开始监听

    //1. 获得一个网络状态检测管理者
    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
    //2. 监听网络的状态
    /*
     AFNetworkReachabilityStatusUnknown          未知
     AFNetworkReachabilityStatusNotReachable     没有网络
     AFNetworkReachabilityStatusReachableViaWWAN 蜂窝网络
     AFNetworkReachabilityStatusReachableViaWiFi WIFI
     */
    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"蜂窝网络");
                break;
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"WIFI");
                break;
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"没有网络");
                break;
            case AFNetworkReachabilityStatusUnknown:
                NSLog(@"未知");
                break;
                
            default:
                break;
        }
    }];
    //3. 开始监听
    [manager startMonitoring];

系统监测网络状态的方式:

1. 可以使用通知的方式来持续监听网络的改变.

#import "Reachability.h"

@interface ViewController ()
@property (nonatomic, strong) Reachability *r;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appleReachability) name:kReachabilityChangedNotification object:nil];
    Reachability *r = [Reachability reachabilityForLocalWiFi];
    
    [r startNotifier];
    self.r = r;
}

// 移除监听
-(void)dealloc
{
    [[NSNotificationCenter defaultCenter]removeObserver:self];
    
}

//1. 使用apple的方式来监听网络状态的改变(可以通过通知的方式持续监听)
- (void)appleReachability
{
    if ([Reachability reachabilityForInternetConnection].currentReachabilityStatus == ReachableViaWWAN) {
        NSLog(@"蜂窝网络");
        return;
    }
    if ([Reachability reachabilityForInternetConnection].currentReachabilityStatus == ReachableViaWiFi) {
        NSLog(@"WIFI");
        return;
    }
    NSLog(@"没有网络");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

white camel

感谢支持~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值