iOS_AFNetWorking框架分析
网络 — 你的程序离开了它就不能生存下去!苹果的Foundation framework中的NSURLConnection又非常难以理解, 不过这里有一个可以使用的替代品:AFNetworking。AFNetworking 包括了所有你需要与在线资源交互的内容,从web services到文件下载。当你的程序在下载一个大文件期间,AFNetworking还能确保你的UI是可以响应的。今天将从三个简单地任务来实现AFNetWorking的极小部分功能(九牛一毛,冰山一角)。在写案例之前,首先AFNetWorking.h文件添加进入。
任务一:通过AFNetWorking框架下载网络数据
1 //通过AFNetWorking框架下载网络数据 2 //1.先创建AFHTTPSessionManager对象 3 AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithBaseURL:[NSURL URLWithString:@"http://127.0.0.1/userManager/"]]; 4 /** 5 * 参数详解: 6 1.要从网络中的到的文件 7 2.传递参数 8 3.成功执行的操作 9 4.失败执行的操作 10 */ 11 //注意:在cities.json之前不能出现路径“/”,否则会出现异常错误。 12 [manager GET:@"cities.json" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { 13 NSArray *provinces =[responseObject objectForKey:@"provinces"]; 14 for(NSString *province in provinces) 15 { 16 NSLog(@"%@",province); 17 } 18 } failure:^(NSURLSessionDataTask *task, NSError *error) { 19 NSLog(@"网络获取失败:%@",error); 20 }];
任务二:下拉刷新数据
要实现下拉刷新功能,首先要创建刷新控件
实现刷新控件的事件响应
刷新控件中有两个方法注意:
//1.开始刷新
- (void)beginRefreshing NS_AVAILABLE_IOS(6_0);
//2.停止刷新
- (void)endRefreshing NS_AVAILABLE_IOS(6_0);
任务三:加载图片的实现
图片的处理过程
1.先从缓存中找是否已经下载相同的图片,如果找到则显示缓存中的图片(根据URL来判断是否是相同的图片)
2.如果没有找到,先显示占位的图片
3.在后台下载图片
4.图片下载完成后,将图片加入缓存,然后显示出来。
为避免给大家看到更多的雷同代码,将任务二、任务三写到一个程序中去拉。
1 #import "ViewController.h" 2 3 @interface ViewController ()<UITableViewDataSource> 4 @property(strong,nonatomic)UITableView *tableView; 5 @property(strong,nonatomic)UIRefreshControl *freshControl; 6 @property(strong,nonatomic)NSMutableArray *datas; 7 @property(strong,nonatomic)NSURL *url; 8 @end 9 10 @implementation ViewController 11 12 - (void)viewDidLoad { 13 [super viewDidLoad]; 14 //1.先创建TableView 15 self.tableView = [[UITableView alloc]initWithFrame:self.view.bounds]; 16 self.tableView.dataSource = self; 17 [self.view addSubview:self.tableView]; 18 //创建刷新控件 19 self.freshControl = [[UIRefreshControl alloc]initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 100)]; 20 [self.freshControl addTarget:self action:@selector(reload:) forControlEvents:UIControlEventValueChanged]; 21 [self.tableView addSubview:self.freshControl]; 22 // [self.tableView.tableHeaderView addSubview:self.freshControl]; 23 /** 24 * 如果是使用的ViewoController则添加到table内,如果采用的tableViewController,可以添加到self.tableView.tableHeaderView中。 25 */ 26 self.datas = [NSMutableArray array]; 27 //设置网络连接路径 28 self.url = [NSURL URLWithString:[NSString stringWithFormat:@"http://127.0.0.1/userManager/0.png"]]; 29 [self reload:nil]; 30 } 31 -(void)reload:(UIRefreshControl *)sender 32 { 33 //添加数据 34 for(int i = 0;i<3;i++) 35 { 36 NSString *string = [NSString stringWithFormat:@"name%d",arc4random_uniform(9)]; 37 [self.datas addObject:string]; 38 } 39 //刷新表格 40 [self.tableView reloadData]; 41 //结束刷新 42 [self.freshControl endRefreshing]; 43 } 44 45 #pragma mark - TableView数据源 46 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 47 { 48 return self.datas.count; 49 } 50 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 51 { 52 //1.根据reuseindentifier先到对象池中去找重用的单元格 53 static NSString *reuseIndetifier = @"myCell"; 54 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIndetifier]; 55 //2.如果没有找到需要自己创建单元格对象 56 if (cell == nil) { 57 cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIndetifier]; 58 } 59 //3.设置单元格对象的内容 60 cell.textLabel.text = [self.datas objectAtIndex:indexPath.row]; 61 //从网络中获取图片, 62 [self setImageWithURL:self.url placeholderImage:[UIImage imageNamed:@"profile-image-placeholder"] setCell:cell]; 63 return cell; 64 } 65 -(void)setImageWithURL:(NSURL *)url 66 placeholderImage:(UIImage *)placeholderImage setCell:(UITableViewCell *)cell 67 { 68 //设置图片占位符 69 [cell.imageView setImage:placeholderImage]; 70 //对路径进行发送请求 71 NSURLRequest *request = [NSURLRequest requestWithURL:self.url]; 72 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) 73 { 74 /** 75 * 如果从网络中下载图片成功,则显示下载的图片,否则使用占位符。 76 */ 77 if (connectionError) 78 { 79 [cell.imageView setImage:placeholderImage]; 80 } 81 else 82 { 83 UIImage *image = [UIImage imageWithData:data]; 84 [cell.imageView setImage:image]; 85 } 86 }]; 87 } 88 @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
运行效果图: