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

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

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

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
 
上一篇:【VueJS】VueJS开发请求本地json数据的配置


下一篇:Windows活动目录系列---AD站点(2)