你的位置:首页 > 操作系统

[操作系统]使用 AFNetworking 进行 XML 和 JSON 数据请求


(1)

使用 AFNetworking 中的 AFHTTPRequestOperation 和 AF

使用

(2)JSON 数据请求

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

  • 使用 AFNetworking 中 的 UIImageView+AFNetworking

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

 

效果如下:

 

 

 

 

请求网址:http://www.web

 1 <ArrayOfString ="http://Web ="http://www.w3.org/2001/ ="http://www.w3.org/2001/> 2   <string> 3     广东 4   </string> 5   <string> 6     广州 7   </string> 8   <string> 9     5928710   </string>11   <string>12     59287.jpg13   </string>14   <string>15     2015-9-19 17:30:3116   </string>17   <string>18     25℃/32℃19   </string>20   <string>21     9月19日 多云转中雨22   </string>23   <string>24     无持续风向微风25   </string>26   <string>27     1.gif28   </string>29   <string>30     8.gif31   </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.gif58   </string>59   <string>60     22.gif61   </string>62   <string>63     24℃/29℃64   </string>65   <string>66     9月21日 中到大雨转雷阵雨67   </string>68   <string>69     无持续风向微风70   </string>71   <string>72     22.gif73   </string>74   <string>75     4.gif76   </string>77   <string>78     广州是广东省的省会,是中国南方最大的海滨城市,广州位于东经113。17`,北纬23。8`,地处中国大陆南部,广东省南部,珠江三角洲北缘。广州临南海,邻近香港特别行政区,是中国通往世界的南大门,广州属丘陵地带。中国的第三大河----珠江从广州市中心穿流而过。广州是一座历史文化名城。相传在远古时候,曾有五位仙人,身穿五色彩服、骑着嘴衔稻穗的五色仙羊降临此地,把稻穗赠给百姓,祝愿这里永无饥荒。从此,广州便有“羊城”、“穗城”的美称,“五羊”也成为广州的象征。广州既是中国也是世界名城,又是一座古城,因历史上有五羊仙子降临献稻穗的故事,广州又称为“羊城”和“穗城”,简称“穗”;广州一年四季如春、繁花似锦,除夕迎春花市闻名海内外,故又有“花城”的美誉。广州地处低纬,属南亚热带季风气候区。地表接受太阳辐射量较多,同时受季风的影响,夏季海洋暖气流形成高温、高湿、多雨的气候;冬季北方大陆冷风形成低温、干燥、少雨的气候。年平均气温为21.4-21.9度,年降雨量平均为1623.6-1899.8mm,北部多于南部。1982年,广州被国务院选定为全国首批历史文化名城之一,是我国重点旅游城市。1999年1月,广州被评为优秀旅游城市。景观:白云山、莲花山、南海神庙、佛山祖庙、广州动物园等。79   </string>80 </ArrayOfString>

View Code

 

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": 8040         },41         "canonical_url": "https://alpha.app.net/hasskod2013",42         "counts": {43           "followers": 16,44           "following": 33,45           "posts": 11722,46           "stars": 047         },48         "cover_image": {49           "height": 260,50           "is_default": true,51           "url": "https://d2rfichhc2fb9n.cloudfront.net/image/5/kZ-JRmTbmd3WVPswTJ8Nwxzkf917InMiOiJzMyIsImIiOiJ0YXBwLWFzc2V0cyIsImsiOiJpL1UvaS9ZL1VpWW5xRFNvTUtyTEhLNXA0OHN2NkxmTmRVMC5qcGciLCJvIjoiIn0",52           "width": 96053         },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": true70   }71 }

View Code 

ViewController.h

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

ViewController.m

 1 #import "ViewController.h" 2 #import "" 3 #import "JSONRequestViewController.h" 4  5 @interface ViewController () 6 - (void)layoutUI; 7 @end 8  9 @implementation ViewController10 - (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       new];62       [self.navigationController pushViewController: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 k//www.web 2 #define kJSONRequestURLStr @"https://alpha-api.app.net/stream/0/posts/stream/global" 3  4 #define kTitleOf 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 code11   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 state31 }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+AFNetworking42 //    [_imgVAvatarImage setImageWithURL:avatarImageURL43 //             placeholderImage:placeholderImage];44     45     //方法二:SDWebImage 框架:UIImageView+WebCache46     [_imgVAvatarImage sd_setImageWithURL:avatarImageURL47               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 <??> 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>

View Code

 

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

 1 #import "" 2 #import "AFNetworking.h" 3 #import "AFNetworkActivityIndicatorManager.h" 4 #import "UIButton+BeautifulButton.h" 5 #import "" 6  7 @interface  8 - (void)layoutUI; 9 - (void)convert)parser; 10 @end 11  12 @implementation  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 = kTitleOf 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)convert)parser { 43   //dictionaryWith 44   NSDictionary *dic = [NSDictionary dictionaryWith 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:k106   NSURLRequest *request = [NSURLRequest requestWithURL:requestURL];107   AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];108   op.responseSerializer = [AF109   [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {110     NSLog(@"JSON: %@", responseObject);111     NS)responseObject;112     //这里使用了第三方框架 113     [self convert114     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 NS128 /* 开始解析 */129 - (void)parserDidStartDocument:(NS)parser {130   NSLog(@"开始解析 ");131 }132 133 /* 当解析器对象遇到 */134 - (void)parser:(NS)qName135   attributes:(NSDictionary *)attributeDict {136   NSLog(@"发现节点:%@", elementName);137 }138 139 /* 当解析器找到开始标记和结束标记之间的字符时,调用这个方法解析当前节点的所有字符 */140 - (void)parser:(NSstring {141   NSLog(@"正在解析节点内容:%@", string);142 }143 144 /* 当解析器对象遇到 */145 - (void)parser:(NS)qName {146   NSLog(@"解析节点结束:%@", elementName);147 }148 149 /* 解析 */150 - (void)parser:(NS)parseError {151   NSLog(@"解析 ", parseError);152 }153 154 /* 解析 */155 - (void)parserDidEndDocument:(NS)parser {156   NSLog(@"解析 ");157 }158 159 @end 

 1 <??> 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="> 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>

View Code 

JSONRequestViewController.h

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

JSONRequestViewController.m

 1 #import "JSONRequestViewController.h" 2 #import "AFNetworking.h" 3 #import "AFNetworkActivityIndicatorManager.h" 4 #import "UIButton+BeautifulButton.h" 5 #import "KMTableViewCell.h" 6 #import "NSString+OpenURL.h" 7  8 static NSString *cellIdentifier = @"cellIdentifier"; 9 @interface JSONRequestViewController () 10 - (void)layoutUI; 11 - (NSString *)displayTimeFromCreatedAt:(NSString *)createdAt; 12 - (void)loadData:(NSArray *)arrData; 13 @end 14  15 @implementation JSONRequestViewController 16  17 - (void)viewDidLoad { 18   [super viewDidLoad]; 19    20   [self layoutUI]; 21 } 22  23 - (void)didReceiveMemoryWarning { 24   [super didReceiveMemoryWarning]; 25   // Dispose of any resources that can be recreated. 26 } 27  28 - (void)layoutUI { 29   self.navigationItem.title = kTitleOfJSONRequest; 30    31   [_btnSendRequest beautifulButton:nil]; 32    33   _mArrCell = [[NSMutableArray alloc] initWithCapacity:0]; 34    35   CGRect rect = [[UIScreen mainScreen] bounds]; 36   CGRect frame = CGRectMake(5.0, 64.0, rect.size.width - 10.0, rect.size.height - 164.0); 37   _tableView =[[UITableView alloc] initWithFrame:frame style:UITableViewStylePlain]; 38   _tableView.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   //方法一:AFHTTPRequestOperation109 //  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   //方法二:AFHTTPRequestOperationManager123   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 - TableView137 - (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:UITableViewCellStyleDefault156                    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 - WebView194 - (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:nil209                         cancelButtonTitle:@"确定"210                          otherButtonTitles:nil, nil];211   [alertVCustom show];212 }213 214 @end 

JSONRequestViewController.xib

 1 <??> 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>

View Code 

AppDelegate.h

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

AppDelegate.m

 1 #import "AppDelegate.h" 2 #import "ViewController.h" 3  4 @interface AppDelegate () 5  6 @end 7  8 @implementation AppDelegate 9 10 11 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {12   _window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];13   ViewController *viewController = [[ViewController alloc]14                    initWithSampleNameArray:@[ kTitleOf15                                  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