iOS中GET 和 POST 数据请求
iOS中GET 和 POST 网络数据请求
同步请求和异步请求的差别:
1.同步请求,有主线程完成网路请求任务,在数据没有请求之前,用户的所有的交互事件应用都无法处理,会造成一种卡顿现象,影响用户体验
2.异步同步,系统默认开辟子线程完成网络请求任务,主线程依然会处理用户的交互事件,此时不会出现卡顿,一旦开辟子线程就会消耗资源(内存),此时就是拿空间换时间
先分析下整体思路:
1.下面准备一个公用的model数据数据模型:
Business.h
#import <Foundation/Foundation.h> @interface Business : NSObject @property(nonatomic,copy)NSString *name;//商户名 @property(nonatomic,copy)NSString *address;//商户地址 @property(nonatomic,copy)NSString *telephone;//电话号码 @property(nonatomic,copy)NSString *title; @property(nonatomic,copy)NSString *summary; @end
Business.m
#import "Business.h" @implementation Business - (void)dealloc{ self.name = nil; self.telephone = nil; self.address = nil; self.title = nil; self.summary = nil; [super dealloc]; } //防止Crash - (void)setValue:(id)value forUndefinedKey:(NSString *)key{ } @end
2.下面准备两个自定义的cell用于两种数据请求的自定义cell:
第一个自定义cell:
BusinessCell.h
#import <UIKit/UIKit.h> @class Business; @interface BusinessCell : UITableViewCell @property (retain, nonatomic) IBOutlet UILabel *nameLabel; @property (retain, nonatomic) IBOutlet UILabel *adressLabel; @property (retain, nonatomic) IBOutlet UILabel *telephoneLabel; //写一个接口给cell上的子控件赋值 - (void)assignValueByBusiness : (Business *)business; @end
BusinessCell.m
#import "BusinessCell.h" #import "Business.h" @implementation BusinessCell - (void)awakeFromNib { // Initialization code } //写一个接口给cell上的子控件赋值 - (void)assignValueByBusiness : (Business *)business{ self.nameLabel.text = business.name; self.telephoneLabel.text = business.telephone; self.adressLabel.text = business.address; } - (void)dealloc { [_nameLabel release]; [_adressLabel release]; [_telephoneLabel release]; [super dealloc]; }@end
第二个自定义cell:
CustomCell.h
#import <UIKit/UIKit.h> @class Business; @interface CustomCell : UITableViewCell @property (retain, nonatomic) IBOutlet UILabel *titleLabel; @property (retain, nonatomic) IBOutlet UILabel *summaryLabel; //写一个方法给cell上的控件赋值 - (void)setValueByName : (Business *)business; @end
CustomCell.m
#import "CustomCell.h" #import "Business.h" @implementation CustomCell - (void)dealloc { [_titleLabel release]; [_summaryLabel release]; [super dealloc]; } //写一个方法给cell上的控件赋值 - (void)setValueByName : (Business *)business{ self.titleLabel.text = business.title; self.summaryLabel.text = business.summary; }@end
——————————————开始介绍数据请求:————————————————
GET数据请求(同步请求):
<span style="color:#3333ff;">#import "GETViewController.h" #import "Business.h" #import "CustomCell.h" #import "BusinessCell.h" @interface GETViewController ()<NSURLConnectionDataDelegate> @property(nonatomic,retain)NSMutableArray *dataSource; @property(nonatomic,retain)NSMutableData *data;//拼接多次请求下来的数据 @end @implementation GETViewController - (void)dealloc{ self.dataSource = nil; self.data = nil; [super dealloc]; } //懒加载 - (NSMutableArray *)dataSource{ if (_dataSource == nil) { self.dataSource = [NSMutableArray arrayWithCapacity:0]; } return [[_dataSource retain]autorelease]; } </span><span style="color:#ff0000;">//同步get请求</span><span style="color:#3333ff;"> - (IBAction)handleGetSyncRequst:(UIBarButtonItem *)sender { //清空数组 [self.dataSource removeAllObjects]; //1.准备网址字符串 NSString *urlStr = @"http://api.map.baidu.com/place/v2/search?query=大保健®ion=上海&output=json&ak=6E823f587c95f0148c19993539b99295"; //2.查看网址字符串中是否含有中文,有中文的话要对urlStr进行转码 NSString *changeUrlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; //3.创建NSURL对象,不能能够存储本地的文件地址,也能存储网络地址 NSURL *url = [NSURL URLWithString:changeUrlStr]; //4.创建网络请求对象(NSURLRequest ) // NSURLRequest 默认请求方式就是GET请求 // NSMutableURLRequest 可以设置网络的请求方式 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //5.建立同步链接 //5.1 创建服务器响应对象 NSURLResponse *response = nil; //5.2 创建请求失败错误信息对象 //以上两个参数都是方法的内部对其赋值 NSError *error = nil; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; // NSLog(@"%@",data); 验证! //调用解析方法 [self parserData:data]; } //封装一个解析的方法 - (void)parserData : (NSData *)data{ //解析: NSMutableDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; // NSLog(@"%@",dataDic); 验证! //取出results key值对应的数组 NSArray *array = dataDic[@"results"]; //遍历数组的字典,并使用给Business对象赋值 for (NSDictionary *dic in array) { //创建数据模型对象 Business *bus = [[Business alloc]init]; //使用kvc给bus赋值 [bus setValuesForKeysWithDictionary:dic]; //添加到存储所有商户信息的数组 [self.dataSource addObject:bus]; //释放 [bus release]; // NSLog(@"%@",self.dataSource); 验证! } //刷新ui界面 [self.tableView reloadData]; }</span>
GET数据请求(异步请求):
<span style="color:#ff0000;">//异步get请求</span> - (IBAction)handleGetAsyncRequst:(UIBarButtonItem *)sender { //清空数组 self.dataSource = nil; //1.创建网址字符串 NSString *urlStr = @"http://api.map.baidu.com/place/v2/search?query=大保健®ion=上海&output=json&ak=6E823f587c95f0148c19993539b99295"; //2.判断是否含有中文 NSString *change = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; //3.创建NSURL对象 NSURL *url = [NSURL URLWithString:change]; //4.创建网络请求 NSURLRequest *requst = [NSURLRequest requestWithURL:url]; //5.创建异步网络连接 // NSOperationQueue 队列类 // [NSOperationQueue mainQueue] 获取主队类 /* //让当前的self 对象处于引用状态 __block typeof(self) weakSelf = self; [NSURLConnection sendAsynchronousRequest:requst queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { //data 就是请求下来的数据 //response 就是响应对象 //connectionError 就是存放连接时报错信息的对象 //调用解析方法 [weakSelf parserData:data]; }]; */ <span style="color:#ff0000;"> //代理完成异步解析</span> [NSURLConnection connectionWithRequest:requst delegate:self]; }
代理完成异步解析:
#pragma mark NSURLConnection 代理方法 //当接收到服务器响应的时候触发 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ //一旦接收到服务器的响应,就创建拼接的data对象 self.data = [NSMutableData data]; } //当接收到服务器数据的时候触发 //此方法有可能触发多次,原因:1.网络环境比较差时 2.请求的数据量比较大的时候,此时服务器会分多次把数据传输过来 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ //拼接服务器传输的数据 [self.data appendData:data]; } //当接收到服务器传输数据结束的时候触发 - (void)connectionDidFinishLoading:(NSURLConnection *)connection{ //此时数据已经接收完毕,可以解析了 [self parserData:self.data]; }
显示在控件上:
- (void)viewDidLoad { [super viewDidLoad]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.dataSource.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { BusinessCell *cell = [tableView dequeueReusableCellWithIdentifier:@"getcell" forIndexPath:indexPath]; //调用cell的控件的赋值方法 [cell assignValueByBusiness:self.dataSource[indexPath.row]]; return cell; }
GET两种数据请求完成!
查看效果:
GET同步和异步数据请求效果:
——————————
————————————————POST数据请求——————————————————————
定义相关属性:
#import "POSTViewController.h" #import "Business.h" #import "CustomCell.h" @interface POSTViewController () @property(nonatomic,retain)NSMutableArray *dataSource; @end @implementation POSTViewController - (void)dealloc{ self.dataSource = nil; [super dealloc]; } - (NSMutableArray *)dataSource{ if (_dataSource == nil) { self.dataSource = [NSMutableArray arrayWithCapacity:0]; } return [[_dataSource retain]autorelease]; }
POST同步数据请求:
//Post同步 //http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx/ //date=20131129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213 - (IBAction)handlePostSyncRequst:(UIBarButtonItem *)sender { [self.dataSource removeAllObjects]; //1.准备网址字符串 NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx/"; //2.创建NSURL对象 NSURL *url = [NSURL URLWithString:urlStr]; //3.创建网络请求对象 NSMutableURLRequest *requst = [NSMutableURLRequest requestWithURL:url]; //3.1配置请求方式 requst.HTTPMethod = @"POST"; //4.创建参数字符串 NSString *bodyString = @"date=20131129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"; //将字符串转换为NSDate独享 NSData *data = [bodyString dataUsingEncoding:NSUTF8StringEncoding]; //配置网络请求的方式 requst.HTTPBody = data; //5.创建网络链接 NSURLResponse *response = nil; NSError *error = nil; NSData *data1 = [NSURLConnection sendSynchronousRequest:requst returningResponse:&response error:&error]; // NSLog(@"%@",data1); [self parserData: data1]; }
POST同步数据请求:
//post异步 - (IBAction)handlePostAsyncRequest:(UIBarButtonItem *)sender { [self.dataSource removeAllObjects]; //1.创建网址字符串 NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx/"; //2.创建NSURL对象 NSURL *url = [NSURL URLWithString:urlStr]; //3.创建网络请求对象 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; //3.1创建请求方式 request.HTTPMethod = @"POST"; //4.创建参数对象 NSString *bodyString = @"date=20131129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"; NSData *data = [bodyString dataUsingEncoding:NSUTF8StringEncoding]; //设置请求对象的body request.HTTPBody = data; //5.创建网络链接 __block typeof(self) weakself = self; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { // NSLog(@"%@",data); [weakself parserData:data]; }]; }
封装一个解析的方法
- (void)parserData : (NSData *)data{ //解析: NSMutableDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; // NSLog(@"%@",dataDic); //验证! //取出results key值对应的数组 NSArray *array = dataDic[@"news"]; // NSLog(@"%@",array); //遍历数组的字典,并使用给Business对象赋值 for (NSDictionary *dic in array) { //创建数据模型对象 Business *bus = [[Business alloc]init]; //使用kvc给bus赋值 [bus setValuesForKeysWithDictionary:dic]; // NSLog(@"%@",bus); //添加到存储所有商户信息的数组 [self.dataSource addObject:bus]; //释放 [bus release]; // NSLog(@"%@",self.dataSource); //验证! } //刷新ui界面 [self.tableView reloadData]; }
显示在控件上:
- (void)viewDidLoad { [super viewDidLoad]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Return the number of sections. return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Return the number of rows in the section. return self.dataSource.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"post" forIndexPath:indexPath]; [cell setValueByName:self.dataSource[indexPath.row]]; return cell; }
POST两种数据请求完成!
查看两种效果效果:
————————————
————————————————————————————————————————————
——————————————介绍同步卡顿现象——————————————————————
BigImageViewController.m
@interface BigImageViewController () @property (retain, nonatomic) IBOutlet UIImageView *bigImageView; @end @implementation BigImageViewController - (IBAction)handleKaDun:(UIButton *)sender { //1.准备网址字符串 NSString *urlStr = @"http://f1.topit.me/1/d2/8c/11663656284128cd21o.jpg"; //2.初始化NSURL对象 NSURL *url = [NSURL URLWithString:urlStr]; //3.创建请求对象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //4.建立网络连接 //4.1创建响应度向 NSURLResponse *response = nil; NSError *errror = nil; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&errror]; //音乐数据,视频数据,图片数据不需要解析直接可以使用 self.bigImageView.image = [UIImage imageWithData:data]; }
效果展示:
————————————————————————————————————————————
iOS中GET 和 POST 数据请求的更多相关文章
- iOS中使用block进行网络请求回调
iOS中使用block进行网络请求回调 HttpRequest.h // // HttpRequest.h // UseBlockCallBack // // Created by Michael o ...
- iOS中使用RSA对数据进行加密解密
RSA算法是一种非对称加密算法,常被用于加密数据传输.如果配合上数字摘要算法, 也可以用于文件签名. 本文将讨论如何在iOS中使用RSA传输加密数据. 本文环境 mac os openssl-1.0. ...
- IOS开发数据存储篇—IOS中的几种数据存储方式
IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09 421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都 ...
- 【原】iOS学习39网络之数据请求
1. HTTP和HTTPS协议 1> URL URL全称是Uniform Resource Locator(统一资源定位符)通过1个URL,能找到互联网上唯一的1个资源 URL就是资源的地址.位 ...
- 安卓中使用OkHttp发送数据请求的两种方式(同、异步的GET、POST) 示例-- Android基础
1.首先看一下最终效果的截图,看看是不是你想要的,这个年代大家都很忙,开门见山很重要! 简要说下,点击不同按钮可以实现通过不同的方式发送OkHttp请求,并返回数据,这里请求的是网页,所以返回的都是些 ...
- iOS中4种判断网络请求的方式(系统状态栏、AFNetworking、Reachability、自定义)
iOS 实时判断网络状态 方法一:利用系统状态栏判断网络状态 // 状态栏是由当前app控制的,首先获取当前app UIApplication *app = [UIApplication shared ...
- nodejs 中 接受前端的数据请求的处理
前台 ----> 后台 后台要接受 前台的数据,只能通过 http 但是 前台接受 后台的数据有 from ajax jsonp nodejs 给我们提供了模块 url 模块,可以 ...
- iOS中去除重复的数据
本人只用了其中一个功能: 需求:一个已知数组arr,判断一个新字符str是否已经存在于arr中,如果不存在,则存入数组arr中 //去重 if (![arr containsObject:str]) ...
- 对比iOS中的四种数据存储
来自于大牛的文章给大家分享下 :http://www.infoq.com/cn/articles/data-storage-in-ios/
随机推荐
- Java高新技术第一篇:类加载器详解
首先来了解一下字节码和class文件的区别: 我们知道,新建一个Java对象的时候,JVM要将这个对象对应的字节码加载到内存中,这个字节码的原始信息存放在classpath(就是我们新建Java工程的 ...
- find 命令查找文件,文件夹
查找文件 find / -name httpd.conf 查找文件夹 find / -name "*1526*" -type d, 其中双引号里的东西表示文件夹名字包含" ...
- vim基本操作
Vim 是 Linux 系统上的最著名的文本/代码编辑器,也是早年的 Vi 编辑器的加强版,而 gVim 则是其 Windows 版.它的最大特色是完全使用键盘命令进行编辑,脱离了鼠标操作虽然使得入门 ...
- LINUX逻辑卷(LVM)管理与逻辑卷分区
LINUX之逻辑卷管理与逻辑卷扩展 LVM是逻辑卷管理(Logical Volume Manager)的简称,他是建立在物理存储设备之上的一个抽象层,允许你生成逻辑存储卷,和直接使用物理存储在管理上相 ...
- 单页应用动态设置页面title
1.适用场景:所有通过router路由的单页应用. 2.示例代码:本文以vue-router为例. 在router.js中: let router = new Router({ routes: [ { ...
- 剑指架构师系列-持续集成之Maven+Nexus+Jenkins+git+Spring boot
1.Nexus与Maven 先说一下这个Maven是什么呢?大家都知道,Java社区发展的非常强大,封装各种功能的Jar包满天飞,那么如何才能方便的引入我们项目,为我所用呢?答案就是Maven,只需要 ...
- MacOS下Rails+Nginx+SSL环境的搭建(下)
五.以Production环境部署Rails项目 这里插一个题外话,我们之前是以development环境运行的rails项目,现在我们希望在实际的生产系统中跑一下看看.这是十分有必要的,应该在rai ...
- Spark核心类:SQLContext和DataFrame
http://blog.csdn.net/pipisorry/article/details/53320669 pyspark.sql.SQLContext Main entry point for ...
- [ExtJS5学习笔记]第三十五节 sencha extjs 5 组件查询方法总结
一个UI前台组件肯定会比较多,我们通常习惯性的使用ID来获取需要操作的组件,但是这种方法是extjs推荐的么?有没有extjs推荐使用的获取组件的方法呢? 目录 目录 extjs的查询组件的API 查 ...
- bmp格式图像的读写函数(对一个开源代码的封装)
在网上看到一段读写bmp格式图像的代码,本文对这段代码分成两个函数封装起来方便使用,一个函数是读取bmp格式的图像,一个是向指定文件写入bmp格式的图像. 前提 我们不需要知道这段代码是如何读取bmp ...