【转】iOS学习笔记(八)——iOS网络通信http之NSURLConnection
移动互联网时代,网络通信已是手机终端必不可少的功能。我们的应用中也必不可少的使用了网络通信,增强客户端与服务器交互。这一篇提供了使用NSURLConnection实现http通信的方式。
NSURLConnection提供了异步请求、同步请求两种通信方式。
1、异步请求
iOS5.0 SDK NSURLConnection类新增的sendAsynchronousRequest:queue:completionHandler:方法,从而使iOS5支持两种异步请求方式。我们先从新增类开始。
1)sendAsynchronousRequest
iOS5.0开始支持sendAsynchronousReques方法,方法使用如下:
- - (void)httpAsynchronousRequest{
- NSURL *url = [NSURL URLWithString:@"http://url"];
- NSString *post=@"postData";
- NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
- NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
- [request setHTTPMethod:@"POST"];
- [request setHTTPBody:postData];
- [request setTimeoutInterval:10.0];
- NSOperationQueue *queue = [[NSOperationQueue alloc]init];
- [NSURLConnection sendAsynchronousRequest:request
- queue:queue
- completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
- if (error) {
- NSLog(@"Httperror:%@%d", error.localizedDescription,error.code);
- }else{
- NSInteger responseCode = [(NSHTTPURLResponse *)response statusCode];
- NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
- NSLog(@"HttpResponseCode:%d", responseCode);
- NSLog(@"HttpResponseBody %@",responseString);
- }
- }];
- }
sendAsynchronousReques可以很容易地使用NSURLRequest接收回调,完成http通信。
2)connectionWithRequest
iOS2.0就开始支持connectionWithRequest方法,使用如下:
- - (void)httpConnectionWithRequest{
- NSString *URLPath = [NSString stringWithFormat:@"http://url"];
- NSURL *URL = [NSURL URLWithString:URLPath];
- NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
- [NSURLConnection connectionWithRequest:request delegate:self];
- }
- - (void)connection:(NSURLConnection *)theConnection didReceiveResponse:(NSURLResponse *)response
- {
- NSInteger responseCode = [(NSHTTPURLResponse *)response statusCode];
- NSLog(@"response length=%lld statecode%d", [response expectedContentLength],responseCode);
- }
- // A delegate method called by the NSURLConnection as data arrives. The
- // response data for a POST is only for useful for debugging purposes,
- // so we just drop it on the floor.
- - (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)data
- {
- if (mData == nil) {
- mData = [[NSMutableData alloc] initWithData:data];
- } else {
- [mData appendData:data];
- }
- NSLog(@"response connection");
- }
- // A delegate method called by the NSURLConnection if the connection fails.
- // We shut down the connection and display the failure. Production quality code
- // would either display or log the actual error.
- - (void)connection:(NSURLConnection *)theConnection didFailWithError:(NSError *)error
- {
- NSLog(@"response error%@", [error localizedFailureReason]);
- }
- // A delegate method called by the NSURLConnection when the connection has been
- // done successfully. We shut down the connection with a nil status, which
- // causes the image to be displayed.
- - (void)connectionDidFinishLoading:(NSURLConnection *)theConnection
- {
- NSString *responseString = [[NSString alloc] initWithData:mData encoding:NSUTF8StringEncoding];
- NSLog(@"response body%@", responseString);
- }
connectionWithRequest需要delegate参数,通过一个delegate来做数据的下载以及Request的接受以及连接状态,此处delegate:self,所以需要本类实现一些方法,并且定义mData做数据的接受。
需要实现的方法:
1、获取返回状态、包头信息。
- - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
2、连接失败,包含失败。
- - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
3、接收数据
- - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
4、数据接收完毕
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;
connectionWithRequest使用起来比较繁琐,而iOS5.0之前用不支持sendAsynchronousRequest。有网友提出了AEURLConnection解决方案。
- AEURLConnection is a simple reimplementation of the API for use on iOS 4. Used properly, it is also guaranteed to be safe against The Deallocation Problem, a thorny threading issue that affects most other networking libraries.
2、同步请求
同步请求数据方法如下:
- - (void)httpSynchronousRequest{
- NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]];
- NSURLResponse * response = nil;
- NSError * error = nil;
- NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest
- returningResponse:&response
- error:&error];
- if (error == nil)
- {
- // 处理数据
- }
- }
同步请求数据会造成主线程阻塞,通常在请求大数据或网络不畅时不建议使用。
从上面的代码可以看出,不管同步请求还是异步请求,建立通信的步骤基本是一样的:
1、创建NSURL
2、创建Request对象
3、创建NSURLConnection连接。
NSURLConnection创建成功后,就创建了一个http连接。异步请求和同步请求的区别是:创建了异步请求,用户可以做其他的操作,请求会在另一个线程执行,通信结果及过程会在回调函数中执行。同步请求则不同,需要请求结束用户才能做其他的操作。
【转】iOS学习笔记(八)——iOS网络通信http之NSURLConnection的更多相关文章
- iOS学习笔记(八)——iOS网络通信http之NSURLConnection
转自:http://blog.csdn.net/xyz_lmn/article/details/8968182 移动互联网时代,网络通信已是手机终端必不可少的功能.我们的应用中也必不可少的使用了网络通 ...
- iOS学习笔记(四)——iOS应用程序生命周期
开发应用程序都要了解其生命周期,开始接触android时也是从应用程序生命周期开始的,android的应用程序生命周期更多是其组件的生命周期,例如Activity.Service.今天我们接触一下iO ...
- iOS学习笔记:iOS核心动画中的常用类型
CATransaction 当我们在自定义的图层上修改某些支持动画的属性时,系统会为该属性的修改自动产生动画.这种其实属于隐式动画.隐式动画要得益于CATransaction. 一个CATransac ...
- iOS学习笔记-精华整理
iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...
- iOS学习笔记总结整理
来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...
- iOS学习笔记——AutoLayout的约束
iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...
- IOS学习笔记25—HTTP操作之ASIHTTPRequest
IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...
- IOS学习笔记之关键词@dynamic
IOS学习笔记之关键词@dynamic @dynamic这个关键词,通常是用不到的. 它与@synthesize的区别在于: 使用@synthesize编译器会确实的产生getter和setter方法 ...
- iOS学习笔记10-UIView动画
上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...
随机推荐
- 洛谷P1896 [SCOI2005]互不侵犯King
P1896 [SCOI2005]互不侵犯King 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 ...
- 洛谷P1312 Mayan游戏
P1312 Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他 ...
- [Xcode 实际操作]四、常用控件-(14)使用UIWebView控件加载本地HTML
目录:[Swift]Xcode实际操作 本文将演示使用网页视图,加载并渲染网页代码. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit im ...
- SAP 权限层次
此文可是没有维护过权限的人对权限有一个整体的认知,转来加以记忆. 一是系统权限 主要是对模块为单位的权限划分,具体就是用户对该模块可见不可见,能不能对该模块进行再授权的操作.表现在用户界面就是用户登录 ...
- IdentityServer4 学习笔记[1]-客户端授权
前言 本文内容来自IdentityServer4官网,官网有详细的介绍,并且有源码Demo 官网源码例子传送门 建立授权服务端 我们暂时不配置Https,选择空模板建立项目,项目建立后, 为了查看de ...
- 打造H5动感影集的爱恨情仇–动画性能篇
“你听说过动感影集么?” 动感影集是QQ空间新功能,可以将静态的图片轻松转变为动态的视频集,且载体是HTML5(简称H5)页面,意味着可以随时分享到空间或朋友圈给好友欣赏! 移动端区别于PC年代的相册 ...
- 旅行青蛙分析(Android篇)
近期旅行青蛙这款游戏非常的火热,周围的朋友.家人都养了一只小青蛙.看到网上有人说这款游戏可以直接逆向编译,没有加密:所以在搜索相关资料后花了一些时间进行逆向分析与修改.这篇文章里,我将介绍如何获取稀有 ...
- hive_hiveserver2 hive-site.xml config and start
hive-site.xml # vi hive-site.xml <configuration> <property> <name>javax.jdo.option ...
- 去除 Git 安装后的右键菜单
64位 windows 8.1 安装 Git 后,右键菜单多了3个选项(Git Init Here,Git Gui, Git Bash),但是用不着,需要删掉.方法如下: 1.在 CMD 中进入 Gi ...
- 09-----JS事件流的概念(重点)
在学习jQuery的事件之前,大家必须要对JS的事件有所了解.看下文 时间的概念 HTML中与javascript交互是通过事件驱动来实现的,例如鼠标点击事件.页面的滚动事件onscroll等等,可以 ...