转载

XML 数据请求与JSON 数据请求

(1)XML 数据请求

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

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

(2)JSON 数据请求

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

  • 使用 AFNetworking 中 的 UIImageView+AFNetworking

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

效果如下:

XML 数据请求与JSON 数据请求

XML 数据请求与JSON 数据请求

XML 数据请求与JSON 数据请求

XML 数据请求与JSON 数据请求

XML 数据格式:

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

XML 数据请求与JSON 数据请求 View Code

XML 数据请求与JSON 数据请求

JSON 数据格式:

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

XML 数据请求与JSON 数据请求 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

XML 数据请求与JSON 数据请求 View Code

XML 数据请求与JSON 数据请求

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:@"广州近三天天气情况:/n"];  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:@"/n %@", arrWeatherInfo[6]];  52         NSUInteger len = mStrWeatherInfo.length - loc;  53         NSValue *valObj = [NSValue valueWithRange:NSMakeRange(loc, len)];  54         [mArrRange addObject:valObj];  55         [mStrWeatherInfo appendFormat:@"/n %@", arrWeatherInfo[5]];  56         [mStrWeatherInfo appendFormat:@"/n %@", arrWeatherInfo[7]];  57         [mStrWeatherInfo appendFormat:@"/n %@", arrWeatherInfo[10]];  58           59         loc = mStrWeatherInfo.length;  60         [mStrWeatherInfo appendFormat:@"/n/n %@", arrWeatherInfo[13]];  61         len = mStrWeatherInfo.length - loc;  62         valObj = [NSValue valueWithRange:NSMakeRange(loc, len)];  63         [mArrRange addObject:valObj];  64         [mStrWeatherInfo appendFormat:@"/n %@", arrWeatherInfo[12]];  65         [mStrWeatherInfo appendFormat:@"/n %@", arrWeatherInfo[14]];  66           67         loc = mStrWeatherInfo.length;  68         [mStrWeatherInfo appendFormat:@"/n/n %@", arrWeatherInfo[18]];  69         len = mStrWeatherInfo.length - loc;  70         valObj = [NSValue valueWithRange:NSMakeRange(loc, len)];  71         [mArrRange addObject:valObj];  72         [mStrWeatherInfo appendFormat:@"/n %@", arrWeatherInfo[17]];  73         [mStrWeatherInfo appendFormat:@"/n %@", arrWeatherInfo[19]];  74           75         [mStrWeatherInfo appendFormat:@"/n/n %@", 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

XML 数据请求与JSON 数据请求 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

XML 数据请求与JSON 数据请求 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

正文到此结束
Loading...