XML 数据请求与JSON 数据请求

来源:互联网 发布:php冒泡排序是什么意思 编辑:程序博客网 时间:2024/05/30 04:18

(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

 

 View Code

 

 

 

JSON 数据格式:

 

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

 

 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 "XMLRequestViewController.h" 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             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 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

 

 View Code

 

 

 

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 NSXMLParserDelegate128 /* 开始解析 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 *)qName135     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

 

 View Code 

 

JSONRequestViewController.h

 

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

 

JSONRequestViewController.m

 

复制代码
 
  1 #import "JSONRequestViewController.h"  2 #import "AFNetworking.h"  3 #import "AFNetworkActivityIndicatorManager.h"  4 #import "UIButton+BeautifulButton.h"  5 #import "KMTableViewCell.h"  6 #import "NSString+OpenURL.h"  7   8 static NSString *cellIdentifier = @"cellIdentifier";  9 @interface JSONRequestViewController () 10 - (void)layoutUI; 11 - (NSString *)displayTimeFromCreatedAt:(NSString *)createdAt; 12 - (void)loadData:(NSArray *)arrData; 13 @end 14  15 @implementation JSONRequestViewController 16  17 - (void)viewDidLoad { 18     [super viewDidLoad]; 19      20     [self layoutUI]; 21 } 22  23 - (void)didReceiveMemoryWarning { 24     [super didReceiveMemoryWarning]; 25     // Dispose of any resources that can be recreated. 26 } 27  28 - (void)layoutUI { 29     self.navigationItem.title = kTitleOfJSONRequest; 30      31     [_btnSendRequest beautifulButton:nil]; 32      33     _mArrCell = [[NSMutableArray alloc] initWithCapacity:0]; 34      35     CGRect rect = [[UIScreen mainScreen] bounds]; 36     CGRect frame = CGRectMake(5.0, 64.0, rect.size.width - 10.0, rect.size.height - 164.0); 37     _tableView =[[UITableView alloc] initWithFrame:frame style:UITableViewStylePlain]; 38     _tableView.dataSource = self; 39     _tableView.delegate = self; 40     //设置边距,解决单元格分割线默认偏移像素过多的问题 41     if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) { 42         [_tableView setSeparatorInset:UIEdgeInsetsZero]; //设置单元格(上左下右)内边距 43     } 44     if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) { 45         [_tableView setLayoutMargins:UIEdgeInsetsZero]; //设置单元格(上左下右)外边距 46     } 47     [self.view addSubview:_tableView]; 48      49     //注册可复用的单元格 50     UINib *nib = [UINib nibWithNibName:@"KMTableViewCell" bundle:nil]; 51     [_tableView registerNib:nib forCellReuseIdentifier:cellIdentifier]; 52      53     //空数据时,显示的提示内容 54     _lblEmptyDataMsg = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 300.0, 50.0)]; 55     CGPoint newPoint = _tableView.center; 56     newPoint.y -= 45.0; 57     _lblEmptyDataMsg.center = newPoint; 58     _lblEmptyDataMsg.text = @"点击「发送请求」按钮获取全球新闻信息"; 59     _lblEmptyDataMsg.textColor = [UIColor grayColor]; 60     _lblEmptyDataMsg.textAlignment = NSTextAlignmentCenter; 61     _lblEmptyDataMsg.font = [UIFont systemFontOfSize:16.0]; 62     [_tableView addSubview:_lblEmptyDataMsg]; 63      64     //点击单元格时,显示的新闻信息详细内容 65     frame = CGRectMake(10.0, CGRectGetMidY(rect) - 200.0, rect.size.width - 20.0, 400.0); 66     _webView = [[UIWebView alloc] initWithFrame:frame]; 67     _webView.layer.borderColor = [UIColor lightGrayColor].CGColor; 68     _webView.layer.borderWidth = 1.0; 69     _webView.delegate = self; 70     _webView.hidden = YES; 71     [self.view addSubview:_webView]; 72      73     [AFNetworkActivityIndicatorManager sharedManager].enabled = YES; 74 } 75  76 - (NSString *)displayTimeFromCreatedAt:(NSString *)createdAt { 77     NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 78     [dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"]; //「2015-09-15T13:23:28Z」 79     NSDate *date = [dateFormat dateFromString:createdAt]; 80      81     NSTimeZone *zone = [NSTimeZone systemTimeZone]; 82     NSInteger interval = [zone secondsFromGMTForDate:date]; //跟 GMT 时间相差8小时 83     date = [date dateByAddingTimeInterval:interval]; 84     [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; //转化为「2015-09-15 21:23:28」 85     NSString *displayTime = [dateFormat stringFromDate:date]; 86     return displayTime; 87 } 88  89 - (void)loadData:(NSArray *)arrData { 90     _mArrCell = [NSMutableArray new]; 91     [arrData enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 92         NSMutableDictionary *mDicCell = [NSMutableDictionary new]; 93         NSDictionary *dicRoot = (NSDictionary *)obj; 94         NSArray *arrLink = [dicRoot valueForKeyPath:@"entities.links"]; 95         [mDicCell setValue:[NSString stringWithFormat:@"%@?w=80&h=80", 96                            [dicRoot valueForKeyPath:@"user.avatar_image.url"]] 97                    forKey:kAvatarImageStr]; 98         [mDicCell setValue:[dicRoot valueForKeyPath:@"user.name"] forKey:kName]; 99         [mDicCell setValue:[dicRoot valueForKey:@"text"] forKey:kText];100         [mDicCell setValue:(arrLink.count > 0 ? [arrLink[0] valueForKey:@"url"] : @"")101                     forKey:kLink];102         [mDicCell setValue:[self displayTimeFromCreatedAt:[dicRoot valueForKey:@"created_at"]]103                     forKey:kCreatedAt];104         [_mArrCell addObject:mDicCell];105     }];106     [self.tableView reloadData];107 }108 109 - (IBAction)sendRequest:(id)sender {110     _lblEmptyDataMsg.text = @"加载中...";111     _webView.hidden = YES;112     113     //方法一:AFHTTPRequestOperation114 //    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     //方法二:AFHTTPRequestOperationManager128     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 - TableView142 - (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:UITableViewCellStyleDefault161                                       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 - WebView211 - (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:nil226                                                  cancelButtonTitle:@"确定"227                                                  otherButtonTitles:nil, nil];228     [alertVCustom show];229 }230 231 @end
 
复制代码

 

JSONRequestViewController.xib

 

 View Code 

 

AppDelegate.h

 

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

 

AppDelegate.m

 

复制代码
 
 1 #import "AppDelegate.h" 2 #import "ViewController.h" 3  4 @interface AppDelegate () 5  6 @end 7  8 @implementation AppDelegate 9 10 11 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {12     _window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];13     ViewController *viewController = [[ViewController alloc]14                                       initWithSampleNameArray:@[ kTitleOfXMLRequest,15                                                                  kTitleOfJSONRequest ]];16     _navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];17     _window.rootViewController = _navigationController;18     //[_window addSubview:_navigationController.view]; //当_window.rootViewController关联时,这一句可有可无19     [_window makeKeyAndVisible];20     return YES;21 }22 23 - (void)applicationWillResignActive:(UIApplication *)application {24 }25 26 - (void)applicationDidEnterBackground:(UIApplication *)application {27 }28 29 - (void)applicationWillEnterForeground:(UIApplication *)application {30 }31 32 - (void)applicationDidBecomeActive:(UIApplication *)application {33 }34 35 - (void)applicationWillTerminate:(UIApplication *)application {36 }37 38 @end
 
复制代码

 

0 0
原创粉丝点击