• XML 数据请求与JSON 数据请求


    (1)XML 数据请求

    使用 AFNetworking 中的 AFHTTPRequestOperation 和 AFXMLParserResponseSerializer,另外结合第三方框架 XMLDictionary 进行数据转换

    使用 XMLDictionary 的好处:有效避免自行实现 NSXMLParserDelegate 委托代理协议方法来进行繁琐的数据拼凑解析

    (2)JSON 数据请求

    使用 AFNetworking 中的 AFHTTPRequestOperation 或 AFHTTPRequestOperationManager,另外在图片缓存方面可选的方案有:

    • 使用 AFNetworking 中 的 UIImageView+AFNetworking

    • 使用第三方框架 SDWebImage 的 UIImageView+WebCache

    效果如下:

     

    XML 数据格式:

    请求网址:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=59287

     View Code

     

    JSON 数据格式:

    请求网址:https://alpha-api.app.net/stream/0/posts/stream/global

     View Code 

    ViewController.h

     
    1 #import <UIKit/UIKit.h>
    2 
    3 @interface ViewController : UITableViewController
    4 @property (copy, nonatomic) NSArray *arrSampleName;
    5 
    6 - (instancetype)initWithSampleNameArray:(NSArray *)arrSampleName;
    7 
    8 @end 
     

    ViewController.m

     
     1 #import "ViewController.h"
     2 #import "XMLRequestViewController.h"
     3 #import "JSONRequestViewController.h"
     4 
     5 @interface ViewController ()
     6 - (void)layoutUI;
     7 @end
     8 
     9 @implementation ViewController
    10 - (void)viewDidLoad {
    11     [super viewDidLoad];
    12     
    13     [self layoutUI];
    14 }
    15 
    16 - (void)didReceiveMemoryWarning {
    17     [super didReceiveMemoryWarning];
    18     // Dispose of any resources that can be recreated.
    19 }
    20 
    21 - (instancetype)initWithSampleNameArray:(NSArray *)arrSampleName {
    22     if (self = [super initWithStyle:UITableViewStyleGrouped]) {
    23         self.navigationItem.title = @"使用 AFNetworking 进行数据请求";
    24         self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:nil action:nil];
    25         
    26         _arrSampleName = arrSampleName;
    27     }
    28     return self;
    29 }
    30 
    31 - (void)layoutUI {
    32     
    33 }
    34 
    35 #pragma mark - UITableViewController相关方法重写
    36 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    37     return 0.1;
    38 }
    39 
    40 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    41     return 1;
    42 }
    43 
    44 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    45     return [_arrSampleName count];
    46 }
    47 
    48 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    49     static NSString *cellIdentifier = @"cell";
    50     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    51     if (!cell) {
    52         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    53     }
    54     cell.textLabel.text = _arrSampleName[indexPath.row];
    55     return cell;
    56 }
    57 
    58 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    59     switch (indexPath.row) {
    60         case 0: {
    61             XMLRequestViewController *XMLRequestVC = [XMLRequestViewController new];
    62             [self.navigationController pushViewController:XMLRequestVC animated:YES];
    63             break;
    64         }
    65         case 1: {
    66             JSONRequestViewController *JSONRequestVC = [JSONRequestViewController new];
    67             [self.navigationController pushViewController:JSONRequestVC animated:YES];
    68             break;
    69             
    70             /*
    71              类似堆栈的先进后出的原理:
    72              返回到(上一级)、(任意级)、(根级)导航
    73              [self.navigationController popViewControllerAnimated:YES];
    74              [self.navigationController popToViewController:thirdSampleVC animated:YES];
    75              [self.navigationController popToRootViewControllerAnimated:YES];
    76              */
    77         }
    78         default:
    79             break;
    80     }
    81 }
    82 
    83 @end 
     

    PrefixHeader.pch

     
    1 #define kXMLRequestURLStr @"http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName?theCityName=59287"
     2 #define kJSONRequestURLStr @"https://alpha-api.app.net/stream/0/posts/stream/global"
     3 
     4 #define kTitleOfXMLRequest @"XML 数据请求"
     5 #define kTitleOfJSONRequest @"JSON 数据请求"
     6 
     7 #define kAvatarImageStr @"avatarImageStr"
     8 #define kName @"name"
     9 #define kText @"text"
    10 #define kLink @"link"
    11 #define kCreatedAt @"createdAt"
    12 
    13 #define kApplication [UIApplication sharedApplication] 
     

    UIButton+BeautifulButton.h

     
     1 #import <UIKit/UIKit.h>
     2 
     3 @interface UIButton (BeautifulButton)
     4 /**
     5  *  根据按钮文字颜色,返回对应文字颜色的圆角按钮
     6  *
     7  *  @param tintColor 按钮文字颜色;nil 的话就为深灰色
     8  */
     9 - (void)beautifulButton:(UIColor *)tintColor;
    10 
    11 @end 
     

    UIButton+BeautifulButton.m

     
     1 #import "UIButton+BeautifulButton.h"
     2 
     3 @implementation UIButton (BeautifulButton)
     4 
     5 - (void)beautifulButton:(UIColor *)tintColor {
     6     self.tintColor = tintColor ?: [UIColor darkGrayColor];
     7     self.layer.masksToBounds = YES;
     8     self.layer.cornerRadius = 10.0;
     9     self.layer.borderColor = [UIColor grayColor].CGColor;
    10     self.layer.borderWidth = 1.0;
    11 }
    12 
    13 @end 
     

    NSString+OpenURL.h

     
     1 #import <UIKit/UIKit.h>
     2 
     3 @interface NSString (OpenURL)
     4 /**
     5  *  打开浏览器
     6  */
     7 - (void)openByBrowser;
     8 
     9 /**
    10  *  打开邮件
    11  */
    12 - (void)openByEmail;
    13 
    14 /**
    15  *  拨打电话
    16  */
    17 - (void)openByTelephone;
    18 
    19 /**
    20  *  打开短信(Short Messaging Service)
    21  */
    22 - (void)openBySMS;
    23 
    24 @end 
     

    NSString+OpenURL.m

     
     1 #import "NSString+OpenURL.h"
     2 
     3 @implementation NSString (OpenURL)
     4 
     5 + (void)open:(NSString *)openURLStr {
     6     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:openURLStr]];
     7 }
     8 
     9 - (void)openByBrowser {
    10     [NSString open:self];
    11 }
    12 
    13 - (void)openByEmail {
    14     [NSString open:[NSString stringWithFormat:@"mailto://%@", self]];
    15 }
    16 
    17 - (void)openByTelephone {
    18     [NSString open:[NSString stringWithFormat:@"tel://%@", self]];
    19 }
    20 
    21 - (void)openBySMS {
    22     [NSString open:[NSString stringWithFormat:@"sms://%@", self]];
    23 }
    24 
    25 @end 
     

    KMTableViewCell.h

     
     1 #import <UIKit/UIKit.h>
     2 
     3 @interface KMTableViewCell : UITableViewCell
     4 @property (strong, nonatomic) IBOutlet UIImageView *imgVAvatarImage;
     5 @property (strong, nonatomic) IBOutlet UILabel *lblName;
     6 @property (strong, nonatomic) IBOutlet UILabel *lblCreatedAt;
     7 @property (strong, nonatomic) IBOutlet UIImageView *imgVLink;
     8 
     9 @property (strong, nonatomic) UILabel *lblText;
    10 @property (copy, nonatomic) NSString *avatarImageStr;
    11 @property (copy, nonatomic) NSString *name;
    12 @property (copy, nonatomic) NSString *text;
    13 @property (copy, nonatomic) NSString *createdAt;
    14 @property (assign, nonatomic, getter=isHaveLink) BOOL haveLink;
    15 
    16 @end 
     

    KMTableViewCell.m

     
     1 #import "KMTableViewCell.h"
     2 //#import "UIImageView+AFNetworking.h"
     3 #import "UIImageView+WebCache.h"
     4 
     5 static UIImage *placeholderImage;
     6 static CGFloat widthOfLabel;
     7 @implementation KMTableViewCell
     8 
     9 - (void)awakeFromNib {
    10     // Initialization code
    11     static dispatch_once_t onceToken;
    12     dispatch_once(&onceToken, ^{
    13         placeholderImage = [UIImage imageNamed:@"JSON"];
    14         widthOfLabel = [[UIScreen mainScreen] bounds].size.width - 100.0;
    15     });
    16     
    17     _imgVAvatarImage.layer.masksToBounds = YES;
    18     _imgVAvatarImage.layer.cornerRadius = 10.0;
    19     
    20     //由于 xib 中对标签自适应宽度找不到合适的方式来控制,所以这里用代码编写;这里屏幕复用的 Cell 有几个,就会执行几次 awakeFromNib 方法
    21     _lblText = [[UILabel alloc] initWithFrame:CGRectMake(90.0, 23.0, widthOfLabel, 42.0)];
    22     _lblText.numberOfLines = 2;
    23     _lblText.font = [UIFont systemFontOfSize:12.0];
    24     [self addSubview:_lblText];
    25 }
    26 
    27 - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    28     [super setSelected:selected animated:animated];
    29 
    30     // Configure the view for the selected state
    31 }
    32 
    33 - (void)setAvatarImageStr:(NSString *)avatarImageStr {
    34     if (![_avatarImageStr isEqualToString:avatarImageStr]) {
    35         _avatarImageStr = [avatarImageStr copy];
    36         NSURL *avatarImageURL = [NSURL URLWithString:_avatarImageStr];
    37         //NSData *avatarImageData = [NSData dataWithContentsOfURL:avatarImageURL];
    38         //_imgVAvatarImage.image = [UIImage imageWithData:avatarImageData];
    39         
    40         //图片缓存;性能优化的第一步
    41         //方法一:AFNetworking 框架:UIImageView+AFNetworking
    42 //        [_imgVAvatarImage setImageWithURL:avatarImageURL
    43 //                         placeholderImage:placeholderImage];
    44         
    45         //方法二:SDWebImage 框架:UIImageView+WebCache
    46         [_imgVAvatarImage sd_setImageWithURL:avatarImageURL
    47                             placeholderImage:placeholderImage];
    48     }
    49 }
    50 
    51 - (void)setName:(NSString *)name {
    52     _name = [name copy];
    53     _lblName.text = _name;
    54 }
    55 
    56 - (void)setText:(NSString *)text {
    57     _text = [text copy];
    58     _lblText.text = _text;
    59 }
    60 
    61 - (void)setCreatedAt:(NSString *)createdAt {
    62     _createdAt = [createdAt copy];
    63     _lblCreatedAt.text = _createdAt;
    64 }
    65 
    66 - (void)setHaveLink:(BOOL)haveLink {
    67     _haveLink = haveLink;
    68     _imgVLink.hidden = !_haveLink;
    69 }
    70 
    71 @end 
     

    KMTableViewCell.xib

     View Code

     

    XMLRequestViewController.h

     
    1 #import <UIKit/UIKit.h>
    2 
    3 @interface XMLRequestViewController : UIViewController <NSXMLParserDelegate>
    4 @property (strong, nonatomic) UITextView *txtVResult;
    5 
    6 @property (strong, nonatomic) IBOutlet UIButton *btnSendRequest;
    7 
    8 @end 
     

    XMLRequestViewController.m

     
      1 #import "XMLRequestViewController.h"
      2 #import "AFNetworking.h"
      3 #import "AFNetworkActivityIndicatorManager.h"
      4 #import "UIButton+BeautifulButton.h"
      5 #import "XMLDictionary.h"
      6 
      7 @interface XMLRequestViewController ()
      8 - (void)layoutUI;
      9 - (void)convertXMLParserToDictionary:(NSXMLParser *)parser;
     10 @end
     11 
     12 @implementation XMLRequestViewController
     13 
     14 - (void)viewDidLoad {
     15     [super viewDidLoad];
     16     
     17     [self layoutUI];
     18 }
     19 
     20 - (void)didReceiveMemoryWarning {
     21     [super didReceiveMemoryWarning];
     22     // Dispose of any resources that can be recreated.
     23 }
     24 
     25 - (void)layoutUI {
     26     self.navigationItem.title = kTitleOfXMLRequest;
     27 
     28     [_btnSendRequest beautifulButton:nil];
     29     
     30     _txtVResult = [UITextView new];
     31     _txtVResult.editable = NO;
     32     CGRect rect = [[UIScreen mainScreen] bounds];
     33     _txtVResult.frame = CGRectMake(5.0, 64.0, rect.size.width - 10.0, rect.size.height - 164.0);
     34     _txtVResult.font = [UIFont systemFontOfSize:15.0];
     35     _txtVResult.text = @"点击「发送请求」按钮获取天气信息";
     36     [self.view addSubview:_txtVResult];
     37     
     38     //启动网络活动指示器;会根据网络交互情况,实时显示或隐藏网络活动指示器;他通过「通知与消息机制」来实现 [UIApplication sharedApplication].networkActivityIndicatorVisible 的控制
     39     [AFNetworkActivityIndicatorManager sharedManager].enabled = YES;
     40 }
     41 
     42 - (void)convertXMLParserToDictionary:(NSXMLParser *)parser {
     43     //dictionaryWithXMLParser: 是第三方框架 XMLDictionary 的方法
     44     NSDictionary *dic = [NSDictionary dictionaryWithXMLParser:parser];
     45     NSMutableString *mStrWeatherInfo = [[NSMutableString alloc] initWithString:@"广州近三天天气情况:
    "];
     46     NSArray *arrWeatherInfo = [dic objectForKey:@"string"];
     47     if (arrWeatherInfo != nil && arrWeatherInfo.count > 22) {
     48         NSMutableArray *mArrRange = [[NSMutableArray alloc] init];
     49         
     50         NSUInteger loc = mStrWeatherInfo.length;
     51         [mStrWeatherInfo appendFormat:@"
     %@", arrWeatherInfo[6]];
     52         NSUInteger len = mStrWeatherInfo.length - loc;
     53         NSValue *valObj = [NSValue valueWithRange:NSMakeRange(loc, len)];
     54         [mArrRange addObject:valObj];
     55         [mStrWeatherInfo appendFormat:@"
     %@", arrWeatherInfo[5]];
     56         [mStrWeatherInfo appendFormat:@"
     %@", arrWeatherInfo[7]];
     57         [mStrWeatherInfo appendFormat:@"
     %@", arrWeatherInfo[10]];
     58         
     59         loc = mStrWeatherInfo.length;
     60         [mStrWeatherInfo appendFormat:@"
    
     %@", arrWeatherInfo[13]];
     61         len = mStrWeatherInfo.length - loc;
     62         valObj = [NSValue valueWithRange:NSMakeRange(loc, len)];
     63         [mArrRange addObject:valObj];
     64         [mStrWeatherInfo appendFormat:@"
     %@", arrWeatherInfo[12]];
     65         [mStrWeatherInfo appendFormat:@"
     %@", arrWeatherInfo[14]];
     66         
     67         loc = mStrWeatherInfo.length;
     68         [mStrWeatherInfo appendFormat:@"
    
     %@", arrWeatherInfo[18]];
     69         len = mStrWeatherInfo.length - loc;
     70         valObj = [NSValue valueWithRange:NSMakeRange(loc, len)];
     71         [mArrRange addObject:valObj];
     72         [mStrWeatherInfo appendFormat:@"
     %@", arrWeatherInfo[17]];
     73         [mStrWeatherInfo appendFormat:@"
     %@", arrWeatherInfo[19]];
     74         
     75         [mStrWeatherInfo appendFormat:@"
    
     %@", arrWeatherInfo[22]];
     76         
     77         //数据的前10个字符以16.0像素加粗显示;这里使用 UITextView 的 attributedText,而他的 text 无法实现这种需求
     78         NSMutableAttributedString *mAttrStr = [[NSMutableAttributedString alloc] initWithString:mStrWeatherInfo];
     79         [mAttrStr addAttribute:NSFontAttributeName
     80                          value:[UIFont boldSystemFontOfSize:16.0]
     81                          range:NSMakeRange(0, 10)];
     82         
     83         //数据的日期部分以紫色显示
     84         for (NSValue *valObj in mArrRange) {
     85             NSRange currentRange;
     86             [valObj getValue:&currentRange];
     87             [mAttrStr addAttribute:NSForegroundColorAttributeName
     88                              value:[UIColor purpleColor]
     89                              range:currentRange];
     90         }
     91         
     92         //数据的前10个字符之后的内容全部以15.0像素显示
     93         [mAttrStr addAttribute:NSFontAttributeName
     94                          value:[UIFont systemFontOfSize:15.0]
     95                          range:NSMakeRange(10, mStrWeatherInfo.length - 10)];
     96         
     97         _txtVResult.attributedText = mAttrStr;
     98     } else {
     99         _txtVResult.text = @"请求数据无效";
    100     }
    101     
    102 }
    103 
    104 - (IBAction)sendRequest:(id)sender {
    105     NSURL *requestURL = [NSURL URLWithString:kXMLRequestURLStr];
    106     NSURLRequest *request = [NSURLRequest requestWithURL:requestURL];
    107     AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    108     op.responseSerializer = [AFXMLParserResponseSerializer serializer];
    109     [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    110         NSLog(@"JSON: %@", responseObject);
    111         NSXMLParser *parser = (NSXMLParser *)responseObject;
    112         //这里使用了第三方框架 XMLDictionary,他本身继承并实现 NSXMLParserDelegate 委托代理协议,对数据进行遍历处理
    113         [self convertXMLParserToDictionary:parser];
    114         
    115         //parser.delegate = self;
    116         //parser.shouldProcessNamespaces = YES;
    117         //[parser parse];
    118     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    119         NSLog(@"Error: %@", error);
    120     }];
    121     //start 是 AFNetworking 的自定义方法,他在自定义的线程中去执行操作;不是 NSOperation 对象实例的 start 方法,所以可以不用使用把操作添加到操作主队列的方法:[[NSOperationQueue mainQueue] addOperation:op]
    122     [op start];
    123 }
    124 
    125 
    126 #pragma mark -
    127 #pragma mark NSXMLParserDelegate
    128 /* 开始解析 XML 文件,在开始解析 XML 节点前,通过该方法可以做一些初始化工作 */
    129 - (void)parserDidStartDocument:(NSXMLParser *)parser {
    130     NSLog(@"开始解析 XML 文件");
    131 }
    132 
    133 /* 当解析器对象遇到 XML 的开始标记时,调用这个方法开始解析该节点 */
    134 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    135     attributes:(NSDictionary *)attributeDict {
    136     NSLog(@"发现节点:%@", elementName);
    137 }
    138 
    139 /* 当解析器找到开始标记和结束标记之间的字符时,调用这个方法解析当前节点的所有字符 */
    140 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    141     NSLog(@"正在解析节点内容:%@", string);
    142 }
    143 
    144 /* 当解析器对象遇到 XML 的结束标记时,调用这个方法完成解析该节点 */
    145 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    146     NSLog(@"解析节点结束:%@", elementName);
    147 }
    148 
    149 /* 解析 XML 出错的处理方法 */
    150 - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
    151     NSLog(@"解析 XML 出错:%@", parseError);
    152 }
    153 
    154 /* 解析 XML 文件结束 */
    155 - (void)parserDidEndDocument:(NSXMLParser *)parser {
    156     NSLog(@"解析 XML 文件结束");
    157 }
    158 
    159 @end 
     

    XMLRequestViewController.xib

     View Code 

    JSONRequestViewController.h

     
     1 #import <UIKit/UIKit.h>
     2 
     3 @interface JSONRequestViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, UIWebViewDelegate>
     4 @property (strong, nonatomic) NSMutableArray *mArrCell;
     5 @property (strong, nonatomic) UITableView *tableView;
     6 @property (strong, nonatomic) UILabel *lblEmptyDataMsg;
     7 @property (strong, nonatomic) UIWebView *webView;
     8 
     9 @property (strong, nonatomic) IBOutlet UIButton *btnSendRequest;
    10 
    11 @end 
     

    JSONRequestViewController.m

     
      1 #import "JSONRequestViewController.h"
      2 #import "AFNetworking.h"
      3 #import "AFNetworkActivityIndicatorManager.h"
      4 #import "UIButton+BeautifulButton.h"
      5 #import "KMTableViewCell.h"
      6 #import "NSString+OpenURL.h"
      7 
      8 static NSString *cellIdentifier = @"cellIdentifier";
      9 @interface JSONRequestViewController ()
     10 - (void)layoutUI;
     11 - (NSString *)displayTimeFromCreatedAt:(NSString *)createdAt;
     12 - (void)loadData:(NSArray *)arrData;
     13 @end
     14 
     15 @implementation JSONRequestViewController
     16 
     17 - (void)viewDidLoad {
     18     [super viewDidLoad];
     19     
     20     [self layoutUI];
     21 }
     22 
     23 - (void)didReceiveMemoryWarning {
     24     [super didReceiveMemoryWarning];
     25     // Dispose of any resources that can be recreated.
     26 }
     27 
     28 - (void)layoutUI {
     29     self.navigationItem.title = kTitleOfJSONRequest;
     30     
     31     [_btnSendRequest beautifulButton:nil];
     32     
     33     _mArrCell = [[NSMutableArray alloc] initWithCapacity:0];
     34     
     35     CGRect rect = [[UIScreen mainScreen] bounds];
     36     CGRect frame = CGRectMake(5.0, 64.0, rect.size.width - 10.0, rect.size.height - 164.0);
     37     _tableView =[[UITableView alloc] initWithFrame:frame style:UITableViewStylePlain];
     38     _tableView.dataSource = self;
     39     _tableView.delegate = self;
     40     //设置边距,解决单元格分割线默认偏移像素过多的问题
     41     if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
     42         [_tableView setSeparatorInset:UIEdgeInsetsZero]; //设置单元格(上左下右)内边距
     43     }
     44     if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) {
     45         [_tableView setLayoutMargins:UIEdgeInsetsZero]; //设置单元格(上左下右)外边距
     46     }
     47     [self.view addSubview:_tableView];
     48     
     49     //注册可复用的单元格
     50     UINib *nib = [UINib nibWithNibName:@"KMTableViewCell" bundle:nil];
     51     [_tableView registerNib:nib forCellReuseIdentifier:cellIdentifier];
     52     
     53     //空数据时,显示的提示内容
     54     _lblEmptyDataMsg = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 300.0, 50.0)];
     55     CGPoint newPoint = _tableView.center;
     56     newPoint.y -= 45.0;
     57     _lblEmptyDataMsg.center = newPoint;
     58     _lblEmptyDataMsg.text = @"点击「发送请求」按钮获取全球新闻信息";
     59     _lblEmptyDataMsg.textColor = [UIColor grayColor];
     60     _lblEmptyDataMsg.textAlignment = NSTextAlignmentCenter;
     61     _lblEmptyDataMsg.font = [UIFont systemFontOfSize:16.0];
     62     [_tableView addSubview:_lblEmptyDataMsg];
     63     
     64     //点击单元格时,显示的新闻信息详细内容
     65     frame = CGRectMake(10.0, CGRectGetMidY(rect) - 200.0, rect.size.width - 20.0, 400.0);
     66     _webView = [[UIWebView alloc] initWithFrame:frame];
     67     _webView.layer.borderColor = [UIColor lightGrayColor].CGColor;
     68     _webView.layer.borderWidth = 1.0;
     69     _webView.delegate = self;
     70     _webView.hidden = YES;
     71     [self.view addSubview:_webView];
     72     
     73     [AFNetworkActivityIndicatorManager sharedManager].enabled = YES;
     74 }
     75 
     76 - (NSString *)displayTimeFromCreatedAt:(NSString *)createdAt {
     77     NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
     78     [dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"]; //「2015-09-15T13:23:28Z」
     79     NSDate *date = [dateFormat dateFromString:createdAt];
     80     
     81     NSTimeZone *zone = [NSTimeZone systemTimeZone];
     82     NSInteger interval = [zone secondsFromGMTForDate:date]; //跟 GMT 时间相差8小时
     83     date = [date dateByAddingTimeInterval:interval];
     84     [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; //转化为「2015-09-15 21:23:28」
     85     NSString *displayTime = [dateFormat stringFromDate:date];
     86     return displayTime;
     87 }
     88 
     89 - (void)loadData:(NSArray *)arrData {
     90     _mArrCell = [NSMutableArray new];
     91     [arrData enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
     92         NSMutableDictionary *mDicCell = [NSMutableDictionary new];
     93         NSDictionary *dicRoot = (NSDictionary *)obj;
     94         NSArray *arrLink = [dicRoot valueForKeyPath:@"entities.links"];
     95         [mDicCell setValue:[NSString stringWithFormat:@"%@?w=80&h=80",
     96                            [dicRoot valueForKeyPath:@"user.avatar_image.url"]]
     97                    forKey:kAvatarImageStr];
     98         [mDicCell setValue:[dicRoot valueForKeyPath:@"user.name"] forKey:kName];
     99         [mDicCell setValue:[dicRoot valueForKey:@"text"] forKey:kText];
    100         [mDicCell setValue:(arrLink.count > 0 ? [arrLink[0] valueForKey:@"url"] : @"")
    101                     forKey:kLink];
    102         [mDicCell setValue:[self displayTimeFromCreatedAt:[dicRoot valueForKey:@"created_at"]]
    103                     forKey:kCreatedAt];
    104         [_mArrCell addObject:mDicCell];
    105     }];
    106     [self.tableView reloadData];
    107 }
    108 
    109 - (IBAction)sendRequest:(id)sender {
    110     _lblEmptyDataMsg.text = @"加载中...";
    111     _webView.hidden = YES;
    112     
    113     //方法一:AFHTTPRequestOperation
    114 //    NSURL *requestURL = [NSURL URLWithString:kJSONRequestURLStr];
    115 //    NSURLRequest *request = [NSURLRequest requestWithURL:requestURL];
    116 //    AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    117 //    op.responseSerializer = [AFJSONResponseSerializer serializer];
    118 //    [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    119 //        NSDictionary *dic = (NSDictionary *)responseObject;
    120 //        [self loadData:(NSArray *)dic[@"data"]];
    121 //    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    122 //        NSLog(@"Error: %@", error);
    123 //    }];
    124 //    //start 是 AFNetworking 的自定义方法,他在自定义的线程中去执行操作;不是 NSOperation 对象实例的 start 方法,所以可以不用使用把操作添加到操作主队列的方法:[[NSOperationQueue mainQueue] addOperation:op]
    125 //    [op start];
    126     
    127     //方法二:AFHTTPRequestOperationManager
    128     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    129     [manager GET:kJSONRequestURLStr parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    130         NSDictionary *dic = (NSDictionary *)responseObject;
    131         [self loadData:(NSArray *)dic[@"data"]];
    132     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    133         NSLog(@"Error: %@", error);
    134     }];
    135 }
    136 
    137 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    138     _webView.hidden = YES;
    139 }
    140 
    141 #pragma mark - TableView
    142 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    143     return @"全球新闻信息列表";
    144 }
    145 
    146 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    147     return 1;
    148 }
    149 
    150 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    151     NSUInteger count = _mArrCell.count;
    152     _lblEmptyDataMsg.hidden = count > 0;
    153     
    154     return count;
    155 }
    156 
    157 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    158     KMTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    159     if (!cell) {
    160         cell = [[KMTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
    161                                       reuseIdentifier:cellIdentifier];
    162     }
    163     
    164     NSMutableDictionary *mDicCell = _mArrCell[indexPath.row];
    165     cell.avatarImageStr = mDicCell[kAvatarImageStr];
    166     cell.name = mDicCell[kName];
    167     cell.text = mDicCell[kText];
    168     cell.createdAt = mDicCell[kCreatedAt];
    169     cell.haveLink = [mDicCell[kLink] length] > 0; //可以通过 isHaveLink 或 haveLink 获取值
    170     return cell;
    171 }
    172 
    173 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    174     return 90.0;
    175 }
    176 
    177 - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    178     /*
    179      viewDidLoad 中对应的操作
    180     if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    181         [_tableView setSeparatorInset:UIEdgeInsetsZero]; //设置单元格(上左下右)内边距
    182     }
    183     if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) {
    184         [_tableView setLayoutMargins:UIEdgeInsetsZero]; //设置单元格(上左下右)外边距
    185     }
    186      */
    187     
    188     if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
    189         [cell setSeparatorInset:UIEdgeInsetsZero];
    190     }
    191     if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
    192         [cell setLayoutMargins:UIEdgeInsetsZero];
    193     }
    194 }
    195 
    196 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    197     NSMutableDictionary *mDicCell = _mArrCell[indexPath.row];
    198     NSString *link = mDicCell[kLink];
    199     if (link.length > 0) {
    200         //使用浏览器打开网址
    201         //[link openByBrowser];
    202         
    203         //使用 WebView 打开网址;由于这里很多网址是外国的,存在有的访问不了、有的访问慢导致加载超时的情况
    204         NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:link]];
    205         [_webView loadRequest:request];
    206         _webView.hidden = NO;
    207     }
    208 }
    209 
    210 #pragma mark - WebView
    211 - (void)webViewDidStartLoad:(UIWebView *)webView {
    212     kApplication.networkActivityIndicatorVisible = YES;
    213 }
    214 
    215 - (void)webViewDidFinishLoad:(UIWebView *)webView {
    216     kApplication.networkActivityIndicatorVisible = NO;
    217 }
    218 
    219 - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
    220     NSLog(@"Error: %@", error);
    221     webView.hidden = YES;
    222     kApplication.networkActivityIndicatorVisible = NO;
    223     UIAlertView *alertVCustom = [[UIAlertView alloc] initWithTitle:@"提示信息"
    224                                                            message:@"网络连接错误"
    225                                                           delegate:nil
    226                                                  cancelButtonTitle:@"确定"
    227                                                  otherButtonTitles:nil, nil];
    228     [alertVCustom show];
    229 }
    230 
    231 @end
     

    JSONRequestViewController.xib

     View Code 

    AppDelegate.h

     
    1 #import <UIKit/UIKit.h>
    2 
    3 @interface AppDelegate : UIResponder <UIApplicationDelegate>
    4 
    5 @property (strong, nonatomic) UIWindow *window;
    6 @property (strong, nonatomic) UINavigationController *navigationController;
    7 
    8 @end 
     

    AppDelegate.m

     
     1 #import "AppDelegate.h"
     2 #import "ViewController.h"
     3 
     4 @interface AppDelegate ()
     5 
     6 @end
     7 
     8 @implementation AppDelegate
     9 
    10 
    11 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    12     _window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    13     ViewController *viewController = [[ViewController alloc]
    14                                       initWithSampleNameArray:@[ kTitleOfXMLRequest,
    15                                                                  kTitleOfJSONRequest ]];
    16     _navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
    17     _window.rootViewController = _navigationController;
    18     //[_window addSubview:_navigationController.view]; //当_window.rootViewController关联时,这一句可有可无
    19     [_window makeKeyAndVisible];
    20     return YES;
    21 }
    22 
    23 - (void)applicationWillResignActive:(UIApplication *)application {
    24 }
    25 
    26 - (void)applicationDidEnterBackground:(UIApplication *)application {
    27 }
    28 
    29 - (void)applicationWillEnterForeground:(UIApplication *)application {
    30 }
    31 
    32 - (void)applicationDidBecomeActive:(UIApplication *)application {
    33 }
    34 
    35 - (void)applicationWillTerminate:(UIApplication *)application {
    36 }
    37 
    38 @end
     

     

    为了更好点交流和学习,请大家在参阅博客后,留下你的疑问和宝贵意见。谢谢!!!!
  • 相关阅读:
    【图灵学院09】RPC底层通讯原理之Netty线程模型源码分析
    【图灵学院10】高并发之java线程池源码分析
    【图灵学院02】大型互联网技术之数据库分库分表
    【图灵学院01】Java程序员开发效率工具IntelliJ IDEA使用
    【OD深入学习】Java多线程面试题
    高级工程师->架构师
    架构师成长之路
    python--openCV--鼠标事件
    python--openCV--视频处理
    python--openCV
  • 原文地址:https://www.cnblogs.com/fshmjl/p/4822407.html
Copyright © 2020-2023  润新知