iOS学习笔记(八)——iOS网络通信http之NSURLConnection

转自:http://blog.csdn.net/xyz_lmn/article/details/8968182

移动互联网时代,网络通信已是手机终端必不可少的功能。我们的应用中也必不可少的使用了网络通信,增强客户端与服务器交互。这一篇提供了使用NSURLConnection实现http通信的方式。

NSURLConnection提供了异步请求、同步请求两种通信方式。

1、异步请求

iOS5.0 SDK
NSURLConnection类新增的sendAsynchronousRequest:queue:completionHandler:方法,从而使iOS5支持两种异步请求方式。我们先从新增类开始。

1)sendAsynchronousRequest


iOS5.0开始支持sendAsynchronousReques方法,方法使用如下:

[cpp] view plaincopyprint?

  1. - (void)httpAsynchronousRequest{
  2. NSURL *url = [NSURL URLWithString:@"http://url"];
  3. NSString *[email protected]"postData";
  4. NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
  5. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

  6. [request setHTTPMethod:@"POST"];

  7. [request setHTTPBody:postData];

  8. [request setTimeoutInterval:10.0];
  9. NSOperationQueue *queue = [[NSOperationQueue alloc]init];

  10. [NSURLConnection sendAsynchronousRequest:request

  11. queue:queue

  12. completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){

  13. if (error) {

  14. NSLog(@"Httperror:%@%d", error.localizedDescription,error.code);

  15. }else{
  16. NSInteger responseCode = [(NSHTTPURLResponse *)response statusCode];
  17. NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  18. NSLog(@"HttpResponseCode:%d", responseCode);

  19. NSLog(@"HttpResponseBody %@",responseString);

  20. }

  21. }];
  22. }

sendAsynchronousReques可以很容易地使用NSURLRequest接收回调,完成http通信。

2)connectionWithRequest

iOS2.0就开始支持connectionWithRequest方法,使用如下:

[cpp] view plaincopyprint?

  1. - (void)httpConnectionWithRequest{
  2. NSString *URLPath = [NSString stringWithFormat:@"http://url"];

  3. NSURL *URL = [NSURL URLWithString:URLPath];

  4. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];

  5. [NSURLConnection connectionWithRequest:request delegate:self];
  6. }
  7. - (void)connection:(NSURLConnection *)theConnection didReceiveResponse:(NSURLResponse *)response

  8. {
  9. NSInteger responseCode = [(NSHTTPURLResponse *)response statusCode];

  10. NSLog(@"response length=%lld  statecode%d", [response expectedContentLength],responseCode);

  11. }
  12. // A delegate method called by the NSURLConnection as data arrives.  The

  13. // response data for a POST is only for useful for debugging purposes,

  14. // so we just drop it on the floor.

  15. - (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)data

  16. {

  17. if (mData == nil) {

  18. mData = [[NSMutableData alloc] initWithData:data];

  19. } else {

  20. [mData appendData:data];

  21. }

  22. NSLog(@"response connection");

  23. }
  24. // A delegate method called by the NSURLConnection if the connection fails.

  25. // We shut down the connection and display the failure.  Production quality code

  26. // would either display or log the actual error.

  27. - (void)connection:(NSURLConnection *)theConnection didFailWithError:(NSError *)error

  28. {
  29. NSLog(@"response error%@", [error localizedFailureReason]);

  30. }
  31. // A delegate method called by the NSURLConnection when the connection has been

  32. // done successfully.  We shut down the connection with a nil status, which

  33. // causes the image to be displayed.

  34. - (void)connectionDidFinishLoading:(NSURLConnection *)theConnection

  35. {

  36. NSString *responseString = [[NSString alloc] initWithData:mData encoding:NSUTF8StringEncoding];

  37. NSLog(@"response body%@", responseString);

  38. }

connectionWithRequest需要delegate参数,通过一个delegate来做数据的下载以及Request的接受以及连接状态,此处delegate:self,所以需要本类实现一些方法,并且定义mData做数据的接受。

需要实现的方法:

1、获取返回状态、包头信息。

[cpp] view plaincopyprint?

  1. - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;

2、连接失败,包含失败。

[cpp] view plaincopyprint?

  1. - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;

3、接收数据

[cpp] view plaincopyprint?

  1. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;

4、数据接收完毕

- (void)connectionDidFinishLoading:(NSURLConnection *)connection;

connectionWithRequest使用起来比较繁琐,而iOS5.0之前用不支持sendAsynchronousRequest。有网友提出了AEURLConnection解决方案。

[html] view plaincopyprint?

  1. 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、同步请求


同步请求数据方法如下:

[cpp] view plaincopyprint?

  1. - (void)httpSynchronousRequest{
  2. NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]];

  3. NSURLResponse * response = nil;

  4. NSError * error = nil;

  5. NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest

  6. returningResponse:&response

  7. error:&error];
  8. if (error == nil)

  9. {

  10. // 处理数据

  11. }

  12. }

同步请求数据会造成主线程阻塞,通常在请求大数据或网络不畅时不建议使用。

从上面的代码可以看出,不管同步请求还是异步请求,建立通信的步骤基本是一样的:

1、创建NSURL

2、创建Request对象

3、创建NSURLConnection连接。

NSURLConnection创建成功后,就创建了一个http连接。异步请求和同步请求的区别是:创建了异步请求,用户可以做其他的操作,请求会在另一个线程执行,通信结果及过程会在回调函数中执行。同步请求则不同,需要请求结束用户才能做其他的操作。

/**

* @author 张兴业

*  http://blog.csdn.net/xyz_lmn

*  iOS入门群:83702688

*  android开发进阶群:241395671

*  我的新浪微博:@张兴业TBOW

*/

参考:

http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html#//apple_ref/doc/uid/20001836-BAJEAIEE

http://codewithchris.com/tutorial-how-to-use-ios-nsurlconnection-by-example/

http://kelp.phate.org/2011/06/ios-stringwithcontentsofurlnsurlconnect.html

iOS学习笔记(八)——iOS网络通信http之NSURLConnection

时间: 2024-10-19 00:41:09

iOS学习笔记(八)——iOS网络通信http之NSURLConnection的相关文章

【转】iOS学习笔记(八)——iOS网络通信http之NSURLConnection

移动互联网时代,网络通信已是手机终端必不可少的功能.我们的应用中也必不可少的使用了网络通信,增强客户端与服务器交互.这一篇提供了使用NSURLConnection实现http通信的方式. NSURLConnection提供了异步请求.同步请求两种通信方式. 1.异步请求 iOS5.0 SDK NSURLConnection类新增的sendAsynchronousRequest:queue:completionHandler:方法,从而使iOS5支持两种异步请求方式.我们先从新增类开始. 1)se

【iOS学习笔记】iOS中的MVC设计模式

模型-视图-控制器(Model-View-Controller,MVC)是Xerox PARC在20世纪80年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已广泛应用于用户交互应用程序中.在iOS开发中MVC的机制被使用的淋漓尽致,充分理解iOS的MVC模式,有助于我们程序的组织合理性. 模型对象模型对象封装了应用程序的数据,并定义操控和处理该数据的逻辑和运算.例如,模型对象可能是表示游戏中的角色或地址簿中的联系人.用户在视图层中所进行的创建或修改数据的操作,通过控制器对象传达

iOS学习笔记-精华整理

iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始等待用户的操作,自动释放池就会被释放掉(调用dealloc),池中的对象都会收到一个release,有可能会因此被销毁. 2-成员属性:     readonly:不指定readonly,默认合成getter和setter方法.外界毫不关心的成员,则不要设置任何属性,这样封装能增加代码的独立性和安全

黑马程序员--IOS学习笔记--数组及排序

IOS学习笔记 概述: 8_2.改变整型变量的符号 8_2.改变整型变量所占存储空间 8_3.char类型数据存储 8_4.数组的基本概念及分类 8_5.数组元素作为函数参数 8_5.一维数组定义及注意事项 8_6.一维数组初始化 8_7.一维数组一个让人疑惑的问题 8_8.一维数组的引用 8_9.应用:数组遍历 8_10.一维数组的存储方式 8_11.一维数组的地址 8_12.一维数组长度计算方法 8_13.一维数组的越界问题 8_14.应用:找最大值 8_15.数组元素作为函数参数 8_16

iOS学习笔记之UITableViewController&UITableView

iOS学习笔记之UITableViewController&UITableView 写在前面 上个月末到现在一直都在忙实验室的事情,与导师讨论之后,发现目前在实验室完成的工作还不足以写成毕业论文,因此需要继续思考新的算法.这是一件挺痛苦的事情,特别是在很难找到与自己研究方向相关的文献的时候.也许网格序列水印这个课题本身的研究意义就是有待考证的.尽管如此,还是要努力的思考下去.由于实验室的原因,iOS的学习进度明显受到影响,加之整理文档本身是一件耗费时间和精力的事情,因此才这么久没有写笔记了. M

iOS: 学习笔记, Swift操作符定义

Swift操作符可以自行定义, 只需要加上简单的标志符即可. @infix 中置运算. 如+,-,*,/运算 @prefix 前置运算. 如- @postfix 后置运算. a++, a-- @assignment 赋值运算. +=, -=, --a, ++a // // main.swift // SwiftBasic // // Created by yao_yu on 14-7-27. // Copyright (c) 2014年 yao_yu. All rights reserved.

IOS学习笔记 -- Modal和Quartz2D

一. Modal1.Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为止;Modal只是改变了View的现实,没有改变rootViewController 2.常用方法1>.以Modal的形式展示控制器- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion2>.关

iOS: 学习笔记, 添加一个带界面约束的控制器

1. 创建一个空iOS应用程序(Empty Application). 2. 添加加控制器类. 修改控制器类的viewDidLoad 1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 //创建标题 5 UILabel *header = [[UILabel alloc] init]; 6 header.text = @"欢迎来到我的世界!"; 7 header.textAlignment = NSTextAlignmentCenter

iOS学习笔记(2)— UIView用户事件响应

iOS学习笔记(2)— UIView用户事件响应 UIView除了负责展示内容给用户外还负责响应用户事件.本章主要介绍UIView用户交互相关的属性和方法. 1.交互相关的属性 userInteractionEnabled 默认是YES ,如果设置为NO则不响应用户事件,并且把当前控件从事件队列中删除.也就是说设置了userInterfaceEnabled属性的视图会打断响应者链导致该view的subview都无法响应事件. multipleTouchEnabled  默认是NO,如果设置为YE