`
xyz_lmn
  • 浏览: 65362 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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连接。异步请求和同步请求的区别是:创建了异步请求,用户可以做其他的操作,请求会在另一个线程执行,通信结果及过程会在回调函数中执行。同步请求则不同,需要请求结束用户才能做其他的操作。


/**
* @author 张兴业
* 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基础——网络请求之NSURLConnection、NSURLSessionDataTask

    在iOS开发中,网络请求是应用与服务器交互的重要方式,主要涉及两个主要的API:NSURLConnection和NSURLSessionDataTask。这两个类都是Apple的Foundation框架提供,用于处理HTTP和其他Web服务的通信。接下来,我们将...

    IOS应用源码——SimpleURLConnections.rar

    在iOS应用开发中,网络通信是不可或缺的一部分,本资源“SimpleURLConnections”提供了一种基础的URL连接处理方式,它基于Apple的Foundation框架,主要利用了NSURLConnection类进行网络请求。本文将深入探讨这个源码...

    IOS应用源码——URLConnectionTest.rar

    在iOS开发中,掌握网络通信技术是至关重要的,而URLSession(原URLConnection)是苹果提供的一种基础网络请求框架,用于处理HTTP和其他互联网协议的通信。本篇文章将深入探讨名为"URLConnectionTest"的iOS应用源码,...

    iOS 断点续传(NSURLConnection简易封装)

    `NSURLConnection`是苹果提供的一个网络请求库,用于发送HTTP请求并接收响应。在iOS 9之后,`NSURLSession`取代了`NSURLConnection`,但在讲解断点续传的初级概念时,`NSURLConnection`仍然适用。 1. **断点续传...

    IOS应用源码——官方网络连接例子 SimpleURLConnections.zip

    URLSession是iOS SDK中的一个关键组件,用于处理HTTP和其他网络协议的通信。 首先,我们要了解URLSession的基本概念。URLSession是Foundation框架的一部分,用于发起异步网络请求。相比于早期的NSURLConnection,...

    IOS应用源码——Stumbler-0.04.1189413695.rar

    4. **网络通信**:Stumbler这个名字暗示它可能与网络活动有关,比如网络嗅探或WiFi信号强度检测。源码中可能会包含网络请求的处理代码,使用`NSURLRequest`、`NSOperationQueue`或者现代的`URLSession` API来处理...

    IOS应用源码——SimpleURLConnections2.rar

    总结,通过对“SimpleURLConnections2”源码的分析,我们可以了解到iOS应用如何利用`NSURLConnection`进行网络通信,包括请求创建、连接建立、数据处理、错误处理以及线程管理等多个方面。理解并熟练掌握这些知识,...

    IOS应用源码——乔布斯WoWTCGUtility-0.81-desktop-0-gc84076b.rar

    总结,通过对“WoWTCGUtility”的源码研究,我们可以学习到Objective-C编程、iOS应用架构、用户界面设计、数据存储、网络通信、游戏开发以及版本控制等多个方面的重要知识。这不仅有助于提升iOS开发技能,也有助于...

    IOS应用源码——SinaOAuth.rar

    在请求处理部分,开发者通常会使用如`NSURLConnection`或`NSURLSession`等网络请求库,构建合适的HTTP请求,这些请求包含了OAuth所需的签名、参数和URL。签名的生成需要正确处理Consumer Key、Consumer Secret、...

    IOS应用源码——一个功能还算完整的浏览器.zip

    这个压缩包文件“IOS应用源码——一个功能还算完整的浏览器.zip”显然包含了iOS平台上一个名为“TSMiniWebBrowser”的小型浏览器应用的源代码。这个应用可能由Tonisalae开发,版本号为e8373e2。下面将详细讨论iOS...

    IOS应用源码——SpaceBubble Source Code for iPhone OS 3.rar

    此外,源码中可能还包含了与网络通信相关的部分,如使用NSURLConnection进行HTTP请求,或者使用NSXMLParser解析XML数据。这些功能在现代iOS应用中常用于获取远程数据,如API接口的调用。 在资源管理和优化方面,...

    IOS应用源码——一些iPhone开源项目代码iflickr.rar

    2. **Cocoa Touch框架**:Cocoa Touch是iOS应用开发的核心,它包含了一系列的框架和类库,如UIKit,Foundation等,用于构建用户界面、处理事件、网络通信等。"iflickr"项目中可能用到了UIKit中的UIViewController、...

    iOS 网络编程

    URLSession是苹果在iOS 7之后推出的一个现代网络通信API,用于替代较老的NSURLConnection。它提供了一种面向任务的API,可以用来发起HTTP/HTTPS请求。URLSession支持三种类型的任务:数据任务、下载任务和上传任务。...

    NSURLConnection

    在Android环境中,虽然不直接使用NSURLConnection,但这个概念可以帮助理解网络通信的基础知识,特别是当我们考虑跨平台开发时。 首先,远程摄像头监控程序通常涉及通过网络传输视频流或静态图像。在iOS和Android...

    IOS应用源码——plamoni-SiriProxy-1fe1dc3.rar

    5. **网络编程**:由于SiriProxy涉及到服务器通信,因此HTTP/HTTPS请求、JSON解析、数据编码解码等网络编程技能至关重要。AFNetworking或NSURLConnection等网络库可能会在项目中被使用。 6. **多线程处理**:为了...

    webservice——ios

    - 在Objective-C中,可以使用`NSURLConnection`类进行异步HTTP请求,它是iOS SDK中早期的网络请求方式。 - `NSURLSession`是现代iOS网络编程的标准,它更高效,支持后台任务,同时提供了数据任务、下载任务和上传...

    一步一步学习 iOS 6 编程

    在iOS 6中,NSURLConnection是常用的网络通信工具,用于发送HTTP请求和接收响应。书中可能会涵盖如何使用它来实现数据的异步加载,以提供良好的用户体验。 除此之外,本书可能还会涉及数据持久化,如使用Core Data...

    iOS开发秘籍中文版 iOS 5 Programming Cookbook

    3. **网络通信**:iOS 5引入了新的网络API,如NSURLConnection和NSURLSession,书中会解释如何使用这些工具进行HTTP请求,以及如何处理异步任务和错误。此外,还会涉及Bonjour服务,使应用能够发现和连接本地网络中...

    IOS网络基础

    尽管它已经在最新的iOS版本中被 NSURLSession 取代,但NSURLConnection仍然是iOS 9以下版本中主流的网络通信解决方案。使用NSURLConnection时,需要创建一个连接(Creating a Connection),并处理各种网络事件。在...

Global site tag (gtag.js) - Google Analytics