网络 — 你的程序离开了它就不能生存下去!苹果的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 ViewController11 12 - (void)viewDidLoad {13     [super viewDidLoad];14     //1.先创建TableView15     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 *)sender32 {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)section47 {48     return self.datas.count;49 }50 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath51 {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 *)url66       placeholderImage:(UIImage *)placeholderImage setCell:(UITableViewCell *)cell67 {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         else82         {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          运行效果图:                          
点赞 0
评论 0
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务