• 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

    运行效果图:

     
  • 相关阅读:
    百练 1936 ll in All 解题报告
    百练 2804 词典 解题报告
    POJ 1226 Substrings 解题报告
    百练 2797 最短前缀 解题报告
    百练 2743 字符串判等 解题报告
    java创建线程的两种方式
    使用.Net Remoting传送Image对象
    Links [IronPython Workflow WCF]
    Hello World!
    Links [ .Net 3.0 Atlas ]
  • 原文地址:https://www.cnblogs.com/xjf125/p/4838932.html
Copyright © 2020-2023  润新知