iOS_AFNetWorking框架分析
网络 — 你的程序离开了它就不能生存下去!苹果的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);
}];
#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框架分析的更多相关文章
- Android/Linux下CGroup框架分析及其使用
1 cgroup介绍 CGroup是control group的简称,它为Linux kernel提供一种任务聚集和划分的机制,可以限制.记录.隔离进程组(process groups)所使用的资源( ...
- 几款开源的hybird移动app框架分析
几款开源的Hybrid移动app框架分析 Ionic Onsen UI 与 ionic 相比 jQuery Mobile Mobile Angular UI 结论 很多移动开发者喜欢使用原生代码开发, ...
- 深入浅出 - Android系统移植与平台开发(十一) - Sensor HAL框架分析之一
作者:唐老师,华清远见嵌入式学院讲师. 1. Sensor的概念 Sensor即传感器,在当前智能手机上大量存在:G-Sensor.LightsSensor. ProximitySensor.Temp ...
- 深入浅出 - Android系统移植与平台开发(八)- HAL Stub框架分析
作者:唐老师,华清远见嵌入式学院讲师. 1. HAL Stub框架分析 HAL stub的框架比较简单,三个结构体.两个常量.一个函数,简称321架构,它的定义在:@hardware/libhardw ...
- openwrt: Makefile 框架分析
openwrt: Makefile 框架分析 原文链接:blog.chinaunix.net/uid-26675482-id-4704952.html 本篇的主要目的是想通过分析Makefile,了解 ...
- Android 核心分析 之六 IPC框架分析 Binder,Service,Service manager
IPC框架分析 Binder,Service,Service manager 我首先从宏观的角度观察Binder,Service,Service Manager,并阐述各自的概念.从Linux的概念空 ...
- VS2010/MFC编程入门之四(MFC应用程序框架分析)
VS2010/MFC编程入门之四(MFC应用程序框架分析)-软件开发-鸡啄米 http://www.jizhuomi.com/software/145.html 上一讲鸡啄米讲的是VS2010应用 ...
- Yii PHP 框架分析(二)
Yii PHP 框架分析(二)作者:wdy http://hi.baidu.com/delphiss/blog/item/54597af595085ad3f3d38552.html Yii是基于组件( ...
- Yii PHP 框架分析 (一)
Yii PHP 框架分析 (一)作者:wdy http://hi.baidu.com/delphiss/blog/item/f7da86d787adb72506088b4b.html 基于yii1.0 ...
随机推荐
- 【转发】linux开发人员常用命令
每个开发人员到了他们职业人生的某个阶段的时候,将会发现自己要寻找有关Linux的信息.我并不是这方面的专家.但是掌握了以下8个命令,我几乎可以得到我任何需要的东西. 注意:以下的命令都有很多扩展的文档 ...
- docker搭建lnmp环境(问题,资料,命令)
入门参考 http://www.runoob.com/docker/docker-install-nginx.html 十大常用命令玩转docker 1. #从官网拉取镜像 docker pull & ...
- C#安装,启动,停止,卸载Windows服务
public class OptionServices { //安装服务 public static void InstallService(string filep ...
- [转]Linux Socket编程 Socket抓取网页源码
“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...
- Intellij IDEA工具的常用快捷键
掌握如下常用快捷键可以使自己的开发效率提供十倍. ctrl + B : 转到类或者方法的定义 ctrl + Alt + B:弹出接口/虚类的实现类/子类 ctrl + Alt + 左箭头/右箭头 : ...
- angularjs 发送ajax请求的问题
在angularjs中使用 ajax 如果使用 jquery的 ajax发送请求会遇到结果返回了,但是页面的值却没有改变,如: $scope.queryNameMatch = function() { ...
- Oracle数据库使用Analyze提升sql性能
Oracle数据库使用Analyze提升sql性能 如果你不使用analyze完成sql优化,将意味着:你拒绝使用数据库的查询优化器,也失去了使用优化连接的机会.假设你创建了一张拥有100万条记录的临 ...
- Linux centos下设置定时备份任务
实现准备 # 需要备份文件路径:/opt/apollo/logs/access_log [root@localhost opt]# cd apollo/ [root@localhost apollo] ...
- 斯坦福大学Andrew Ng - 机器学习笔记(6) -- 聚类 & 降维
大概用了一个月,Andrew Ng老师的机器学习视频断断续续看完了,以下是个人学习笔记,入门级别,权当总结.笔记难免有遗漏和误解,欢迎讨论. 鸣谢:中国海洋大学黄海广博士提供课程视频和个人笔记,在此深 ...
- android自定义View (五)view.requestLayout() 与 invalidate()
一.要点 If in the course of processing the event, the view's bounds may need to be changed, the view wi ...