使用 AFNetworking 进行 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

 1 <ArrayOfString xmlns="http://WebXml.com.cn/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 2     <string>
 3         广东
 4     </string>
 5     <string>
 6         广州
 7     </string>
 8     <string>
 9         59287
10     </string>
11     <string>
12         59287.jpg
13     </string>
14     <string>
15         2015-9-19 17:30:31
16     </string>
17     <string>
18         25℃/32℃
19     </string>
20     <string>
21         9月19日 多云转中雨
22     </string>
23     <string>
24         无持续风向微风
25     </string>
26     <string>
27         1.gif
28     </string>
29     <string>
30         8.gif
31     </string>
32     <string>
33         今日天气实况:气温:31℃;风向/风力:西南风 1级;湿度:62%;空气质量:暂无;紫外线强度:弱
34     </string>
35     <string>
36         太阳镜指数:必要。建议佩戴透射比为1级的浅色太阳镜。
37 穿衣指数:炎热。建议穿短衫、短裤等清凉夏季服装。
38 旅游指数:适宜。微风,虽天气稍热,但不会影响心情。
39 运动指数:较适宜。户外运动请注意防晒。
40 洗车指数:不宜。有雨,雨水和泥水会弄脏爱车。
41 化妆指数:防脱水。请选用防脱水化妆品。
42 感冒指数:少发。感冒机率较低,避免长期处于空调屋中。
43 空气污染指数:暂无。
44 紫外线指数:弱。辐射较弱,涂擦SPF12-15、PA+护肤品。
45 舒适度指数:较不舒适。多云,有些热。
46     </string>
47     <string>
48         25℃/29℃
49     </string>
50     <string>
51         9月20日 中雨转中到大雨
52     </string>
53     <string>
54         无持续风向微风
55     </string>
56     <string>
57         8.gif
58     </string>
59     <string>
60         22.gif
61     </string>
62     <string>
63         24℃/29℃
64     </string>
65     <string>
66         9月21日 中到大雨转雷阵雨
67     </string>
68     <string>
69         无持续风向微风
70     </string>
71     <string>
72         22.gif
73     </string>
74     <string>
75         4.gif
76     </string>
77     <string>
78         广州是广东省的省会,是中国南方最大的海滨城市,广州位于东经113。17`,北纬23。8`,地处中国大陆南部,广东省南部,珠江三角洲北缘。广州临南海,邻近香港特别行政区,是中国通往世界的南大门,广州属丘陵地带。中国的第三大河----珠江从广州市中心穿流而过。广州是一座历史文化名城。相传在远古时候,曾有五位仙人,身穿五色彩服、骑着嘴衔稻穗的五色仙羊降临此地,把稻穗赠给百姓,祝愿这里永无饥荒。从此,广州便有“羊城”、“穗城”的美称,“五羊”也成为广州的象征。广州既是中国也是世界名城,又是一座古城,因历史上有五羊仙子降临献稻穗的故事,广州又称为“羊城”和“穗城”,简称“穗”;广州一年四季如春、繁花似锦,除夕迎春花市闻名海内外,故又有“花城”的美誉。广州地处低纬,属南亚热带季风气候区。地表接受太阳辐射量较多,同时受季风的影响,夏季海洋暖气流形成高温、高湿、多雨的气候;冬季北方大陆冷风形成低温、干燥、少雨的气候。年平均气温为21.4-21.9度,年降雨量平均为1623.6-1899.8mm,北部多于南部。1982年,广州被国务院选定为全国首批历史文化名城之一,是我国重点旅游城市。1999年1月,广州被评为优秀旅游城市。景观:白云山、莲花山、南海神庙、佛山祖庙、广州动物园等。
79     </string>
80 </ArrayOfString>

JSON 数据格式:

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

 1 {
 2     "data": [
 3         {
 4             "canonical_url": "https://alpha.app.net/hasskod2013/post/64791677",
 5             "created_at": "2015-09-19T11:23:30Z",
 6             "entities": {
 7                 "hashtags": [
 8                 ],
 9                 "links": [
10                     {
11                         "len": 21,
12                         "pos": 163,
13                         "text": "http://bit.ly/1Ynt5DC",
14                         "url": "http://bit.ly/1Ynt5DC"
15                     }
16                 ],
17                 "mentions": [
18                 ]
19             },
20             "html": "<span itemscope=\"https://app.net/schemas/Post\">Oman says ambassador‘s home hit in Yemen: Foreign ministry condemns incident in Sanaa as Arab coalition bombards Houthi-held sites as part of move to retake city. <a href=\"http://bit.ly/1Ynt5DC\">http://bit.ly/1Ynt5DC</a></span>",
21             "id": "64791677",
22             "machine_only": false,
23             "num_replies": 0,
24             "num_reposts": 0,
25             "num_stars": 0,
26             "pagination_id": "64791677",
27             "source": {
28                 "client_id": "8dWzbxxwZeTTAH3v7Yy9TbJ82W6mexqH",
29                 "link": "http://twitterfeed.com",
30                 "name": "twitterfeed"
31             },
32             "text": "Oman says ambassador‘s home hit in Yemen: Foreign ministry condemns incident in Sanaa as Arab coalition bombards Houthi-held sites as part of move to retake city. http://bit.ly/1Ynt5DC",
33             "thread_id": "64791677",
34             "user": {
35                 "avatar_image": {
36                     "height": 80,
37                     "is_default": false,
38                     "url": "https://d2rfichhc2fb9n.cloudfront.net/image/5/8crtOD1QaZ4b0uA6GnTQQMVTgJJ7InMiOiJzMyIsImIiOiJhZG4tdXNlci1hc3NldHMiLCJrIjoiYXNzZXRzL3VzZXIvMjMvZmIvNTAvMjNmYjUwMDAwMDAwMDAwMC5wbmciLCJvIjoiIn0",
39                     "width": 80
40                 },
41                 "canonical_url": "https://alpha.app.net/hasskod2013",
42                 "counts": {
43                     "followers": 16,
44                     "following": 33,
45                     "posts": 11722,
46                     "stars": 0
47                 },
48                 "cover_image": {
49                     "height": 260,
50                     "is_default": true,
51                     "url": "https://d2rfichhc2fb9n.cloudfront.net/image/5/kZ-JRmTbmd3WVPswTJ8Nwxzkf917InMiOiJzMyIsImIiOiJ0YXBwLWFzc2V0cyIsImsiOiJpL1UvaS9ZL1VpWW5xRFNvTUtyTEhLNXA0OHN2NkxmTmRVMC5qcGciLCJvIjoiIn0",
52                     "width": 960
53                 },
54                 "created_at": "2013-08-28T11:18:40Z",
55                 "id": "155975",
56                 "locale": "ar_AA",
57                 "name": "hasskod",
58                 "timezone": "Asia/Baghdad",
59                 "type": "feed",
60                 "username": "hasskod2013"
61             }
62         },
63         //同样格式的19个数组元素内容,这里省略...
64     ],
65     "meta": {
66         "code": 200,
67         "max_id": "64791677",
68         "min_id": "64791658",
69         "more": true
70     }
71 }

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

 1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 2 <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
 3     <dependencies>
 4         <deployment identifier="iOS"/>
 5         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
 6     </dependencies>
 7     <objects>
 8         <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File‘s Owner"/>
 9         <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
10         <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="cellIdentifier" rowHeight="101" id="KGk-i7-Jjw" customClass="KMTableViewCell">
11             <rect key="frame" x="0.0" y="0.0" width="375" height="101"/>
12             <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
13             <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
14                 <rect key="frame" x="0.0" y="0.0" width="320" height="43"/>
15                 <autoresizingMask key="autoresizingMask"/>
16                 <subviews>
17                     <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="3Br-R7-YsD">
18                         <rect key="frame" x="0.0" y="5" width="80" height="80"/>
19                     </imageView>
20                     <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="name" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kPR-pa-8uG">
21                         <rect key="frame" x="90" y="2" width="230" height="21"/>
22                         <fontDescription key="fontDescription" type="boldSystem" pointSize="14"/>
23                         <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
24                         <nil key="highlightedColor"/>
25                     </label>
26                     <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="created_at" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="iAH-dO-aus">
27                         <rect key="frame" x="90" y="64" width="130" height="21"/>
28                         <fontDescription key="fontDescription" type="system" pointSize="12"/>
29                         <color key="textColor" red="0.40000000596046448" green="0.40000000596046448" blue="0.40000000596046448" alpha="1" colorSpace="calibratedRGB"/>
30                         <nil key="highlightedColor"/>
31                     </label>
32                     <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="Action_ReadOriginal" translatesAutoresizingMaskIntoConstraints="NO" id="By5-cw-IJd">
33                         <rect key="frame" x="223" y="60" width="30" height="30"/>
34                     </imageView>
35                 </subviews>
36             </tableViewCellContentView>
37             <connections>
38                 <outlet property="imgVAvatarImage" destination="3Br-R7-YsD" id="KaV-vS-y5p"/>
39                 <outlet property="imgVLink" destination="By5-cw-IJd" id="wrr-zz-EqH"/>
40                 <outlet property="lblCreatedAt" destination="iAH-dO-aus" id="BNF-es-fb1"/>
41                 <outlet property="lblName" destination="kPR-pa-8uG" id="BH7-oj-3Kx"/>
42             </connections>
43             <point key="canvasLocation" x="254.5" y="377.5"/>
44         </tableViewCell>
45     </objects>
46     <resources>
47         <image name="Action_ReadOriginal" width="60" height="60"/>
48     </resources>
49 </document>

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

 1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 2 <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
 3     <dependencies>
 4         <deployment identifier="iOS"/>
 5         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
 6     </dependencies>
 7     <objects>
 8         <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File‘s Owner" customClass="XMLRequestViewController">
 9             <connections>
10                 <outlet property="btnSendRequest" destination="zCQ-LM-grx" id="tgt-2z-WaB"/>
11                 <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
12             </connections>
13         </placeholder>
14         <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
15         <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
16             <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
17             <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
18             <subviews>
19                 <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="zCQ-LM-grx">
20                     <rect key="frame" x="250" y="520" width="100" height="40"/>
21                     <constraints>
22                         <constraint firstAttribute="width" constant="100" id="V3R-30-5vV"/>
23                         <constraint firstAttribute="height" constant="40" id="yct-84-Mk4"/>
24                     </constraints>
25                     <state key="normal" title="发送请求">
26                         <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
27                     </state>
28                     <connections>
29                         <action selector="sendRequest:" destination="-1" eventType="touchUpInside" id="8zG-Dl-erk"/>
30                     </connections>
31                 </button>
32             </subviews>
33             <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
34             <constraints>
35                 <constraint firstAttribute="bottom" secondItem="zCQ-LM-grx" secondAttribute="bottom" constant="40" id="DBx-zw-hdG"/>
36                 <constraint firstAttribute="centerX" secondItem="zCQ-LM-grx" secondAttribute="centerX" id="F2b-L7-BR9"/>
37             </constraints>
38         </view>
39     </objects>
40 </document>

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

JSONRequestViewController.xib

 1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 2 <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
 3     <dependencies>
 4         <deployment identifier="iOS"/>
 5         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
 6     </dependencies>
 7     <objects>
 8         <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File‘s Owner" customClass="JSONRequestViewController">
 9             <connections>
10                 <outlet property="btnSendRequest" destination="zCQ-LM-grx" id="tgt-2z-WaB"/>
11                 <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
12             </connections>
13         </placeholder>
14         <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
15         <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
16             <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
17             <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
18             <subviews>
19                 <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="zCQ-LM-grx">
20                     <rect key="frame" x="250" y="520" width="100" height="40"/>
21                     <constraints>
22                         <constraint firstAttribute="width" constant="100" id="V3R-30-5vV"/>
23                         <constraint firstAttribute="height" constant="40" id="yct-84-Mk4"/>
24                     </constraints>
25                     <state key="normal" title="发送请求">
26                         <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
27                     </state>
28                     <connections>
29                         <action selector="sendRequest:" destination="-1" eventType="touchUpInside" id="8zG-Dl-erk"/>
30                     </connections>
31                 </button>
32             </subviews>
33             <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
34             <constraints>
35                 <constraint firstAttribute="bottom" secondItem="zCQ-LM-grx" secondAttribute="bottom" constant="40" id="DBx-zw-hdG"/>
36                 <constraint firstAttribute="centerX" secondItem="zCQ-LM-grx" secondAttribute="centerX" id="F2b-L7-BR9"/>
37             </constraints>
38         </view>
39     </objects>
40 </document>

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-08 21:30:19

使用 AFNetworking 进行 XML 和 JSON 数据请求的相关文章

XML 数据请求与JSON 数据请求

(1)XML 数据请求 使用 AFNetworking 中的 AFHTTPRequestOperation 和 AFXMLParserResponseSerializer,另外结合第三方框架 XMLDictionary 进行数据转换 使用 XMLDictionary 的好处:有效避免自行实现 NSXMLParserDelegate 委托代理协议方法来进行繁琐的数据拼凑解析 (2)JSON 数据请求 使用 AFNetworking 中的 AFHTTPRequestOperation 或 AFHTT

支持XML和JSON数据的图表控件FusionCharts XT

FusionCharts XT是一款功能强大的图表控件,同时支持HTML5和Flash,可以用于PCs, Macs, iPads, iPhones ,支持XML和JSON数据,可以帮您为您的Web应用创建交互式的.数据驱动的图表.仪表盘和地图.它具有智能化.用户友好和创新等特点,可以将单调的数据转化为栩栩如生的图像,从而使您的Web应用更加的生动.它可以完美的应用于web应用软件.管理仪表板.分析学.展示和决策支持系统,可以与诸如ASP.ASP.NET.PHP.JSP.ColdFusion和Ru

php xml和json数据产生接口

<span style="font-size:18px;">/** * 返回结果集 * * @param mixed $info 返回的有效数据集或是错误说明 * @param string $msg 为空或是错误类型代号 * @param string $result 请求成功或是失败的标识 * @param int $post 1为xml方式,2为json方式 * */ function getData($info, $msg = '', $post, $result

使用solr将CSV/XML/DB/JSON数据发布为Rest Service

Download http://lucene.apache.org/solr/downloads.html Apache Solr入门基础——Windows下安装与配置 https://blog.csdn.net/wsxsxz_/article/details/62048595 Start $ cd E:\01_SOFT\Java\solr-8.2.0\bin $ solr start solr start –p <端口号> 单机版启动solr服务 solr restart –p <端口

ios解析XML和json数据

解析的基本概念所谓“解析”:从事先规定好的格式串中提取数据解析的前提:提前约定好格式.数据提供方按照格式提供数据.数据获取方按照格式获取数据iOS开发常见的解析:XML解析.JSON解析 一.XML数据结构XML数据结构基本概念XML:Extensible Markup language (可扩展标记语言),主流格式之一,可以用来存储和传输数据格式之一,可以用来存储和传输数据 XML数据格式的功能1.数据交换2.内容管理3.用作配置文件 XML数据结构的语法1.声明2.节点使用一对标签表示3.根

AFNetworking如何post一个json数据到服务器

网址:http://my.oschina.net/gexun/blog/316408 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; //申明返回的结果是json类型 manager.responseSerializer = [AFJSONResponseSerializer serializer]; //申明请求的数据是json类型 manager.requestSerializ

XML、JSON数据解析

解析: XML解析 XML:可扩展性标记语言   主流数据格式之一 功能:数据交换 .web服务 .内容管理 . 用作配置文件(重点) SAX 解析-->逐行解析(采用协议回调机制) 实现协议NSXMLParserDelegate - (void)startParse { //xml解析:逐行解析 //从文件列表中读取数据 //1.获得文件路径 NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"Student&q

【总结整理】json数据请求简化版理解(祺哥的成果)

在同源js目录下新建.txt文件 { "news":[ {"title":"审计管理","time":"2018-03-10 21:00"}, {"title":"菜单管理","time":"2018-03-10 21:00"}, {"title":"订单管理","time&qu

通过form发送xml、json数据

The best way I can think of is to intercept the form-submit action, and convert the form details into XML format, and then submit that to the server. There are many ways to do this, but the easiest would be to implement a solution via a framework lik