网络 — 你的程序离开了它就不能生存下去!苹果的Foundation framework中的NSURLConnection又非常难以理解, 不过这里有一个可以使用的替代品:AFNetworking。AFNetworking 包括了所有你需要与在线资源交互的内容,从web services到文件下载。当你的程序在下载一个大文件期间,AFNetworking还能确保你的UI是可以响应的。今天将从三个简单地任务来实现AFNetWorking的极小部分功能(九牛一毛,冰山一角)。在写案例之前,首先AFNetWorking.h文件添加进入。

任务一:通过AFNetWorking框架下载网络数据

 //通过AFNetWorking框架下载网络数据
//1.先创建AFHTTPSessionManager对象
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithBaseURL:[NSURL URLWithString:@"http://127.0.0.1/userManager/"]];
/**
* 参数详解:
1.要从网络中的到的文件
2.传递参数
3.成功执行的操作
4.失败执行的操作
*/
//注意:在cities.json之前不能出现路径“/”,否则会出现异常错误。
[manager GET:@"cities.json" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
NSArray *provinces =[responseObject objectForKey:@"provinces"];
for(NSString *province in provinces)
{
NSLog(@"%@",province);
}
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"网络获取失败:%@",error);
}];
任务二:下拉刷新数据
要实现下拉刷新功能,首先要创建刷新控件
实现刷新控件的事件响应
刷新控件中有两个方法注意:
//1.开始刷新
- (void)beginRefreshing NS_AVAILABLE_IOS(6_0);
//2.停止刷新
- (void)endRefreshing NS_AVAILABLE_IOS(6_0);
 
任务三:加载图片的实现
图片的处理过程
1.先从缓存中找是否已经下载相同的图片,如果找到则显示缓存中的图片(根据URL来判断是否是相同的图片)
2.如果没有找到,先显示占位的图片
3.在后台下载图片
4.图片下载完成后,将图片加入缓存,然后显示出来。
 
为避免给大家看到更多的雷同代码,将任务二、任务三写到一个程序中去拉。
 #import "ViewController.h"

 @interface ViewController ()<UITableViewDataSource>
@property(strong,nonatomic)UITableView *tableView;
@property(strong,nonatomic)UIRefreshControl *freshControl;
@property(strong,nonatomic)NSMutableArray *datas;
@property(strong,nonatomic)NSURL *url;
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
//1.先创建TableView
self.tableView = [[UITableView alloc]initWithFrame:self.view.bounds];
self.tableView.dataSource = self;
[self.view addSubview:self.tableView];
//创建刷新控件
self.freshControl = [[UIRefreshControl alloc]initWithFrame:CGRectMake(, , self.tableView.frame.size.width, )];
[self.freshControl addTarget:self action:@selector(reload:) forControlEvents:UIControlEventValueChanged];
[self.tableView addSubview:self.freshControl];
// [self.tableView.tableHeaderView addSubview:self.freshControl];
/**
* 如果是使用的ViewoController则添加到table内,如果采用的tableViewController,可以添加到self.tableView.tableHeaderView中。
*/
self.datas = [NSMutableArray array];
//设置网络连接路径
self.url = [NSURL URLWithString:[NSString stringWithFormat:@"http://127.0.0.1/userManager/0.png"]];
[self reload:nil];
}
-(void)reload:(UIRefreshControl *)sender
{
//添加数据
for(int i = ;i<;i++)
{
NSString *string = [NSString stringWithFormat:@"name%d",arc4random_uniform()];
[self.datas addObject:string];
}
//刷新表格
[self.tableView reloadData];
//结束刷新
[self.freshControl endRefreshing];
} #pragma mark - TableView数据源
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.datas.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//1.根据reuseindentifier先到对象池中去找重用的单元格
static NSString *reuseIndetifier = @"myCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIndetifier];
//2.如果没有找到需要自己创建单元格对象
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIndetifier];
}
//3.设置单元格对象的内容
cell.textLabel.text = [self.datas objectAtIndex:indexPath.row];
//从网络中获取图片,
[self setImageWithURL:self.url placeholderImage:[UIImage imageNamed:@"profile-image-placeholder"] setCell:cell];
return cell;
}
-(void)setImageWithURL:(NSURL *)url
placeholderImage:(UIImage *)placeholderImage setCell:(UITableViewCell *)cell
{
//设置图片占位符
[cell.imageView setImage:placeholderImage];
//对路径进行发送请求
NSURLRequest *request = [NSURLRequest requestWithURL:self.url];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError)
{
/**
* 如果从网络中下载图片成功,则显示下载的图片,否则使用占位符。
*/
if (connectionError)
{
[cell.imageView setImage:placeholderImage];
}
else
{
UIImage *image = [UIImage imageWithData:data];
[cell.imageView setImage:image];
}
}];
}
@end

程序运行效果图:

在网络连接中,谁人愿意使用自己的手机流量尝试下载一个较大的文件啊!那不是傻子吗?但是如果在下载时,自己却没有发现使用的不是WIFI而是自己的流量时,那时真是痛苦无泪啊!看着手机流量一点点第减少。所有,在使用网络之前最好能通过检测网络状态,有一个网络连接提醒。

网络连接状态

#import "ViewController.h"
#import "AFNetworking.h" @interface ViewController ()<NSURLConnectionDataDelegate> @end @implementation ViewController #pragma mark - UI方法
- (void)viewDidLoad {
[super viewDidLoad];
//检测网络状态
[self checkNetworkStatus];
} #pragma mark - 私有方法
#pragma mark 网络状态变化提示
-(void)alert:(NSString *)message{
UIAlertView *alertView=[[UIAlertView alloc]initWithTitle:@"System Info" message:message delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles: nil];
[alertView show];
} #pragma mark 网络状态监测
-(void)checkNetworkStatus{
//创建一个用于测试的url
NSURL *url=[NSURL URLWithString:@"http://www.baidu.com"];
//HTTP请求操作管理
AFHTTPRequestOperationManager *operationManager=[[AFHTTPRequestOperationManager alloc]initWithBaseURL:url]; //根据不同的网络状态改变去做相应处理
[operationManager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusReachableViaWWAN:
[self alert:@"2G/3G/4G网络连接."];
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
[self alert:@"WiFi网络连接."];
break;
case AFNetworkReachabilityStatusNotReachable:
[self alert:@"网络不可达."];
break; default:
[self alert:@"网络信号不可识别."];
break;
}
}]; //开始网络信号监控
[operationManager.reachabilityManager startMonitoring];
}
@end

运行效果图:

 

iOS_AFNetWorking框架分析的更多相关文章

  1. Android/Linux下CGroup框架分析及其使用

    1 cgroup介绍 CGroup是control group的简称,它为Linux kernel提供一种任务聚集和划分的机制,可以限制.记录.隔离进程组(process groups)所使用的资源( ...

  2. 几款开源的hybird移动app框架分析

    几款开源的Hybrid移动app框架分析 Ionic Onsen UI 与 ionic 相比 jQuery Mobile Mobile Angular UI 结论 很多移动开发者喜欢使用原生代码开发, ...

  3. 深入浅出 - Android系统移植与平台开发(十一) - Sensor HAL框架分析之一

    作者:唐老师,华清远见嵌入式学院讲师. 1. Sensor的概念 Sensor即传感器,在当前智能手机上大量存在:G-Sensor.LightsSensor. ProximitySensor.Temp ...

  4. 深入浅出 - Android系统移植与平台开发(八)- HAL Stub框架分析

    作者:唐老师,华清远见嵌入式学院讲师. 1. HAL Stub框架分析 HAL stub的框架比较简单,三个结构体.两个常量.一个函数,简称321架构,它的定义在:@hardware/libhardw ...

  5. openwrt: Makefile 框架分析

    openwrt: Makefile 框架分析 原文链接:blog.chinaunix.net/uid-26675482-id-4704952.html 本篇的主要目的是想通过分析Makefile,了解 ...

  6. Android 核心分析 之六 IPC框架分析 Binder,Service,Service manager

    IPC框架分析 Binder,Service,Service manager 我首先从宏观的角度观察Binder,Service,Service Manager,并阐述各自的概念.从Linux的概念空 ...

  7. VS2010/MFC编程入门之四(MFC应用程序框架分析)

    VS2010/MFC编程入门之四(MFC应用程序框架分析)-软件开发-鸡啄米 http://www.jizhuomi.com/software/145.html   上一讲鸡啄米讲的是VS2010应用 ...

  8. Yii PHP 框架分析(二)

    Yii PHP 框架分析(二)作者:wdy http://hi.baidu.com/delphiss/blog/item/54597af595085ad3f3d38552.html Yii是基于组件( ...

  9. Yii PHP 框架分析 (一)

    Yii PHP 框架分析 (一)作者:wdy http://hi.baidu.com/delphiss/blog/item/f7da86d787adb72506088b4b.html 基于yii1.0 ...

随机推荐

  1. JSP接口浅析

    一.tree型关系 JSP页面继承了org.apache.jasper.runtime.HttpJspBase抽象类并实现了org.apache.jasper.runtime.JspSourceDep ...

  2. Struts2上传文件(1)

    使用Struts框架后, Struts2框架不会处理multipart/form-data的请求,它需要调用其他的上传文件框架来解析二进制数据.但是Struts在原有的上传解析器基础上做了很多的封装, ...

  3. git分支管理与冲突解决(转载)

    Git 分支管理和冲突解决 原文:http://www.cnblogs.com/mengdd/p/3585038.html 创建分支 git branch 没有参数,显示本地版本库中所有的本地分支名称 ...

  4. php 工厂方法模式

    #使用工厂方法模式是不知道要创建类的对象有哪些.interface IFactory{ public function CreateOperation();#工厂方法模式只有单个产品 } class ...

  5. 【BZOJ1731】[Usaco2005 dec]Layout 排队布局 差分约束

    [BZOJ1731][Usaco2005 dec]Layout 排队布局 Description Like everyone else, cows like to stand close to the ...

  6. SharePoint服务器端对象模型 之 访问文件和文件夹(Part 2)

    4.添加文件夹 文件夹的创建方法在文档库和普通列表中稍有不同. 在文档库中,与一般的集合操作相同,直接使用SPFolderCollection的Add(string name)方法即可添加文件夹,例如 ...

  7. [JavaScript] this、call和apply详解

    在JavaScript编程中,理解this.call和apply是道槛,如果能正确的理解它们的本质及其应用.那么在以后的JavaScript中会得心应手. this 跟别的语言大相径庭的是,JavaS ...

  8. VS2010编译报错FileTracker error FTK1011

    系统重装,TFS重新映射,编译项目报错,出现 FileTracker error FTK1011,折腾半天未搞定,网上找到答案,可能是路径更改导致(未验证): 修改MSNET.Framework 目标 ...

  9. 自定义表单验证--jquery validator addMethod的使用

    原文地址:jquery validator addMethod 方法的使用作者:蜡笔小玄 jQuery.validate是一款非常不错的表单验证工具,简单易上手,而且能达到很好的体验效果,虽然说在项目 ...

  10. do not use numbers as enumeration values

    w 字段类型设置错误 有限元的判断,勿用枚举行. MySQL :: MySQL 5.7 Reference Manual :: 12.4.4 The ENUM Typehttps://dev.mysq ...