(新版 和 旧版) AFNetwork 简单的使用说明--第三方库(ARC)--监听当前网络状态 -- 设置最大等待时间

 AF的请求 是基于NSURLReuqest的。且使用的时异步队列,AFHTTPRequestOperation



在新版的AFNetWorking加入了监听当前网络的状态,可以判断当前的移动设备是出于3G/WIFI/还是2G等...,但是新版的需要导入官方库。


 使用新版的AFNetWorking需添加官方库:(旧版的不需要)

    Security.framework

    MobileCoreService.framework

    SystemConfiguration.framework



 在AFNetWork中设置最大等待时间,可以通过创建请求的时候设置。

//创建请求并设置超时时间

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[baseUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]

    cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];  


AFNetWork可以有多种请求方式,包含了8种HTTP请求的方式。

!!需要 最后设置开始请求的方式有: [operation start];


在旧版中:

AFHTTPRequestOperation 默认的普通请求,它返回的是NSData数据,需要json或xml解析。

AFJSONRequestOperation json请求,它返回的是json解析后的结果(数组或者字典)。

AFXMLRequestOperation ……


不需要设置开始请求,它会自动开始请求的是:

AFHTTPClient  ---  它可以设置(8种Http请求方式)


-(void)startReuest
{
    /**
            AF的请求 是基于NSURLReuqest的。且使用的时异步队列,AFHTTPRequestOperation
        */
    NSURL *url=[NSURL URLWithString:@"https://api.douban.com/v2/book/search?q=harry&start=0"];
    AFHTTPRequestOperation *operation=[[AFHTTPRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:url]];
    //设置完成后的block回调,这里的responseObject就是NSData,需要解析
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        
        //json或xml解析
        
        
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        
    }];
    
    //开始请求
    [operation start];
}

-(void)jsonReuqest
{
    NSURL *url=[NSURL URLWithString:@"https://api.douban.com/v2/book/search?q=harry&start=0"];
    
    //  json的AF请求
    AFJSONRequestOperation *operation=[[AFJSONRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:url]];
    //这里完成请求后,得到的数据在responseObiect里,因为是json请求,所以,它自动的已经解析了,responseObiect就是解析后的字典或数组
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        
    } failure:
^(AFHTTPRequestOperation *operation, NSError *error) {
    
}];
    
    [operation start];
}

-(void)clientRequest
{
    //baseurl 就是前半段请求地址
    AFHTTPClient *client=[[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://10.0.8.8/sns/"]];
    /*
                使用AFHTTPClient请求的结果responseObject,是NSData,需要解析
        */
    //进行get请求
    [client getPath:@"my/user_list.php" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
       
        //json 或 xml 解析
        
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        
    }];
    //进行post请求
    [client postPath:@"my/user_list.php" parameters:@{@"count":@"20"} success:^(AFHTTPRequestOperation *operation, id responseObject) {
        
        //json 或 xml 解析
        
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        
    }];

}

在新版中:

新版的 AFNetWorking请求是基于一个请求队列管理器 AFHTTPRequestOperationManager来实现请求的。

 使用新版的AFNetWorking需添加官方库:(旧版的不需要)

    Security.framework

    MobileCoreService.framework

    SystemConfiguration.framework


代码:


#pragma mark - 判断当前网络状态
- (void)monitorNetworkType
{
    //AFNetworking通过呼叫某个服务器来监测网络状态,因此建议呼叫大型门户网站
    
    //创建一个请求队列的管理对象
    AFHTTPRequestOperationManager * manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"www.baidu.com"]];
    
    //监控网络状态
    [manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        //异步任务,当网络状态发生改变,回调这个方法
        //判断网络状态
        
        switch (status) {
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"网络未连接");
                break;
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"3G网络");
                break;
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"WIFI网络");
                break;
                
                
            default:
                break;
        }
        
    }];
    
    //启动监控
    [manager.reachabilityManager startMonitoring];
}

#pragma mark - 异步加载图片
//异步下载图片数据,赋给UIImageView
- (void)asyncLoadImage
{
    //创建图片视图
    UIImageView * imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:imageView];
    
    [imageView setImageWithURL:[NSURL URLWithString:@"http://10.0.8.8/sns/my/headimage.php?uid=10"]];
}

#pragma mark - GET请求 JSON数据
//如果下载的是JSON数据,可以自动解析成字典或数组
- (void)jsonGetRequest
{
    //URLString
    NSString * urlString = @"http://10.0.8.8/sns/my/user_list.php";
    
    //创建请求数据的队列管理器,单例
    AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager];
    
    //设置数据的格式
    //如果JSON文件就按照下面设置,能自动进行解析
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];
    
    
    //发起请求了,设置请求成功失败的block
    [manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        //成功
        //数据会回调在responseObject中,如果是JSON则数据已经被解析,responseObject根据数据源的不同,可能是字典或数组
        NSLog(@"%@", responseObject);
        
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        //失败
        NSLog(@"%@", error);
    }];
}


#pragma mark - GET请求 非JSON数据
- (void)dataGetRequest
{
    NSString * urlString = @"http://10.0.8.8/sns/my/user_list.php";
    
    AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager];
    
    //设置请求的数据格式,设置为data,适用于任何格式,获取到数据之后是NSData格式,我们可以自己解析
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    
    [manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        //成功
        //responseObject装着数据,是NSData
        NSString * str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        
        NSLog(@"%@", str);
        
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"%@", error);
    }];
}

#pragma mark - POST请求
- (void)postRequest
{
    NSString * url = @"http://localhost/cgi-bin/post1.cgi";
    //访问cgi-bin服务器,访问POST1.cgi程序
    
    //创建单例对象
    AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager];
    
    //获取接收的回馈数据的类型,POST请求也会收到回馈
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    
    //post键值对
    NSDictionary * dict = @{@"username":@"Tom", @"password":@"123456", @"message":@"woooooooooow"};
    
    //发送请求
    [manager POST:url parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) {
        
        NSLog(@"成功!%@",[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);
        
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        
        NSLog(@"失败%@", error);
        
    }];
    
}

#pragma mark - 上传文件
- (void)uploadFile
{
    NSString * url = @"http://localhost/cgi-bin/post2.cgi";
    
    AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager];
    
    
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    
    
    //发送数据
    [manager POST:url parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        //在这里将需要发送的数据,添加到formData对象
        
        //找到图片
        NSString * imagePath = [[NSBundle mainBundle] pathForResource:@"annotation" ofType:@"png"];
        
        //将图片转成data
        NSData * data = [NSData dataWithContentsOfFile:imagePath];
        
        //将data传给formData
        [formData appendPartWithFileData:data name:@"image" fileName:@"annotation.png" mimeType:@"image/png"];
        //mimeType:@"image/png" @"text/html" @"text/json" @"text/xml" @"image/jpeg"等
        
        
    } success:^(AFHTTPRequestOperation *operation, id responseObject) {
        
        NSLog(@"成功");
        
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        
        NSLog(@"失败");
        
    }];
}

#pragma mark - 文件下载
- (void)requestFile
{
    NSString * urlString = @"http://10.0.8.8/download/归档Archieve.pdf";
    //创建下载实用类
    AFURLSessionManager * manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
    //参数是用来管理进度显示等kvo数据的
    
    //因为路径存在中文,无法转成URL,需要转码
    urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    
    NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
    
    //第一个参数是请求,第二个参数是进度对象指针的地址,为了返回进度
    
    //__autoreleasing修饰传入地址的对象指针
    __autoreleasing NSProgress * progress = nil;
    //调用函数后,会自动创建一个progress对象,然后改变progress指针的值,让它指向这个对象
    
    //返回一个下载任务
    NSURLSessionDownloadTask * task = [manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
        //告诉下载管理器,文件存储的路径
        NSString * path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/视频.mp4"];
        return [NSURL fileURLWithPath:path];
        
    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
        //下载完成的回调,可能正确可能错误
        if (error) {
            NSLog(@"%@", error);
        }
    }];
    
    //启动下载任务
    [task resume];
    
    _task = task;
    
    NSLog(@"%@", NSHomeDirectory());
    
    //得到了progress对向
    _progress = progress;
    //用成员变量指向,如同做了一个强引用,保证刚刚创建的progress对象不会在当前函数结束时消失
    
    //设置观察者,观察进度  属性@"fractionCompleted"表示完成的进度
    [_progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:nil];
}

//监控下载进度
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if (object == _progress && [keyPath isEqualToString:@"fractionCompleted"] == YES) {
        //        NSLog(@"%f%%", [change[@"new"] doubleValue] * 100);
        NSLog(@"%.2f%%", _progress.fractionCompleted * 100);
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值