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

 

JSON 数据格式:

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

 

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

 

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

 

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

 

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
时间: 2024-10-25 19:32:20

XML 数据请求与JSON 数据请求的相关文章

【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回

作者:ssslinppp      时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MVC与json参考文章:[spring学习笔记-mvc-3]返回json数据-方式1  和 [spring学习笔记-mvc-4]返回json数据-方式2. 使用到的技术主要如下: Ajax:使用JQuery 提供的ajax:==>需要引入jquery.min.js文件: Spring MVC: Jso

android通过httpClient请求获取JSON数据并且解析

android通过httpClient请求获取JSON数据并且解析:http://www.cnblogs.com/gzggyy/archive/2013/05/08/3066288.html Android--使用Http向服务器发送请求并取得返回结果,下载图片:http://www.2cto.com/kf/201307/229489.html Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据):http://blog.csdn.net/he

swift http请求返回json数据并解析

1 AppDelegate.swift // // AppDelegate.swift // QQDemo // // Created by 赵超 on 14-6-21. // Copyright (c) 2014年 赵超. All rights reserved. // import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? fun

Android 网络请求json数据,解析json数据,生成对应的java bean类一步到位,快速开发

Android 网络请求一般都涉及到图片和JSON数据,怎样快速的请求网络JSON数据,解析JSON数据,并且一步生成自己想要的Java bean实体类?这个涉及到Android 开发效率的问题.由于接触Android 网络这方面比较多,自然就找到一些好的方法来快速开发Android 网络模块的相关内容,接下来就为大家揭晓 一步快速请求,解析JSON 数据生成对应的Java bean实体类的方法. 注:我们先把思路讲解下吧: 1.网络请求JSON数据代码可以自己写,当然我还是推荐使用网络上开源的

异步请求(删除json数据)

异步请求(删除json数据) 删除数据库信息, 同时页面对应的样式也随之删除 Demo: 删除雇员信息1.在控制层定义删除的方法 //删除数据 public void jsonRemove(HttpServletRequest req,HttpServletResponse resp) throws Exception { //获取要删除的雇员的编号 Integer empno = Integer.valueOf(req.getParameter("id")); //调用业务层的删除方

Nginx下HTML页面POST请求静态JSON数据返回405状态

在浏览器访问HTML页面,发现一些静态JSON数据没有显示,F12查看,如下图所示: 可以看到请求方式为POST 将请求链接复制在浏览器地址栏访问,可以正常请求到数据 F12查看,可以看到请求方式为GET,状态码为200 可知问题为:Nginx下HTML页面POST请求静态JSON数据返回405状态,但用GET请求则正常返回数据. 百度后,有说,Apache.IIS.Nginx等绝大多数Web服务器,都不允许静态文件响应POST请求. 下面进行测试: 系统为CentOS7.5,Nginx(版本:

iOS之网络数据下载和Json数据解析

iOS之网络数据下载和Json数据解析 简介 在本文中笔者将要给大家介绍iOS中如何利用NSURLConnection从网络上下载数据,如何解析下载下来的JSON数据,以及如何显示数据和图片的异步下载显示 涉及到的知识点: 1.NSURLConnection异步下载封装 2.JSON格式和JSON格式解析 3.数据显示和使用SDWebImage异步显示图片 内容 1.网络下载基础知识介绍 (1)什么是网络应用? 一般情况下, iPhone的计算机, 照相机不需要从网络上下载数据也能运行, 所以这

用ajax获取后台数据,返回json数据,怎么在前台使用?

用ajax获取后台数据,返回json数据,怎么在前台使用呢? 后台 C# code ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 if (dataType == "SearchCustomer")                 {                     int ID;                     if (Int32.TryParse(CustomerID, out ID))                     {    

异步请求取得json数据

一.异步请求 在之前我们请求数据的时候都是整个页面全部刷新了一次,也就是每次请求都会重新请求所有的资源.但是在很多时候不需要页面全部刷新,仅仅是需要页面的局部数据刷新即可,此时需要发送异步请求来实现这种局部数据刷新的要求,异步请求简称 Ajax(Asynchronous Javascript And XML),在之前一般使用js 发送异步请求,请求的数据一般是xml,但是现在 json 出现之后就不使用xml 做为数据传输格式标准了.使用jQuery 发送异步请求,jq中的异步请求发送有很多方式