网络 — 你的程序离开了它就不能生存下去!苹果的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. css3的线性渐变效果

    1.代码: <!doctype html> <html lang="en"> <head> <meta charset="UTF ...

  2. 初窥ElasticSearch

    初窥ElasticSearch 官网上面的,不知道讲的是什么.. youtube上面有一个start with,内容是在windows以下跑这个elastic search,然后用一个fidler工具 ...

  3. Android-ViewPagerIndicator框架使用——LinePageIndicator

    前言:LinePageIndicator类似CirclePageIndicator,只是将圆点指示变成了长条指示. 一:使用是定义的布局文件simple_lines : <LinearLayou ...

  4. python3----函数(join)

    今天写python 100例时,有个题目是大致是这样的:已知输入形式是1+3+2+1,要求输出形式为1+1+2+3 一开始思路是将输入的字符串用split()函数划分成数组,在对数组进行排序,再用fo ...

  5. ios 蓝牙相关

      ios蓝牙开发项目实战 -(附小米手环实例)   前言 最近一直在开发关于蓝牙的功能,本来是不想写这一篇文章,因为网上关于ios蓝牙开发的文章实在太多了,成吨成吨的文章出现,但是很遗憾都只是一些皮 ...

  6. a database of all existing files

    mlocate.db(5): mlocate database - Linux man page  https://linux.die.net/man/5/mlocate.db Name mlocat ...

  7. 任务06——封装与单元测试(Markdown版)

    模块代码地址 Core 模块代码地址 单元测试代码地址 两个地址是一样的,为了方便,所以把测试的代码很模块代码放在一起git了. 封装阶段 public class Core { public sta ...

  8. dev 小问题列表

    1. MemoEdit > Lines Text lines are separated by line feed and carriage return characters ("\ ...

  9. php扩展redis链接失败,返回false

    刚开始接触redis,发现一直返回false,其实只要关闭防火墙就可以连接成功了. 关闭selinux操作   方法1:修改grub.conf将参数selinux=1修改为等于selinux=0,这个 ...

  10. MySQL权限系统(二). MySQL提供的特权 Privileges Provided by MySQL

    MySQL provides privileges that apply in different contexts and at different levels of operation: Adm ...