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/
随机推荐
- 总结angular+ionic项目中的问题
1:tab的路由导向问题 运用ion-tabs时,第一个ion-tabs标签下的href功能会覆盖掉路由中定义的默认路由(进入应用后直接加载href指向的组件). 解决方法:多写一个ion-tabs标 ...
- Struts2 转换器
转换器 从一个 HTML 表单到一个 Action 对象,类型转换是从字符串到非字符串 Http 没有 "类型" 的概念,每一项表单的输入只可能是一个字符串或一个字符串数组,在服务 ...
- CODEVS3269混合背包+二进制优化
codevs 3296 http://codevs.cn/problem/3269/ 题目描述 Description 背包体积为V ,给出N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么至 ...
- Go 语言递归函数
递归,就是在运行的过程中调用自己. 语法格式如下: func recursion() { recursion() /* 函数调用自身 */ } func main() { recursion() } ...
- PHP 实例 AJAX 与 MySQL
AJAX 数据库实例 下面的实例将演示网页如何通过 AJAX 从数据库读取信息: 实例 Person info will be listed here... 实例解释 - MySQL 数据库 在上 ...
- python3.6 使用 pymysql 连接 Mysql 数据库及 简单的增删改查操作
1.通过 pip 安装 pymysql 进入 cmd 输入 pip install pymysql 回车等待安装完成: 安装完成后出现如图相关信息,表示安装成功. 2.测试连接 import ...
- Java中使用long类型实现精确的四则运算
引子 Effective Java 2nd Edition 第48条建议:如果需要精确的答案,请避免使用float和doble.float和double类型主要是为了科学计算和工程计算而设计的.他们执 ...
- DB 查询分析器7.01 新增的保存执行结果到多个文件功能
1 引言 中国本土程序员马根峰(CSDN专访马根峰:海量数据处理与分析大师的中国本土程序员)推出的个人作品----万能数据库查询分析器,中文版本DB 查询分析器.英文版本< ...
- GDAL库进度信息编写示例
GDAL进度信息编写 GDAL库中的算法以及读写数据的时候一般都会提供两个与进度信息相关的参数,下面分别进行描述: GDALProgressFunc pfnProgress void * pProgr ...
- 本人正竞选CSDN博客之星,欢迎各位来访的朋友能为我投上一票
投票网址:http://blog.csdn.net/vote/candidate.html?username=morixinguan&from=timeline 谢谢各位!