`

NSURLConnection的基本使用和利用它创建Restful风格的访问

    博客分类:
  • ios
ios 
阅读更多

       NSURLConnection:

       NSURLConnection的基本使用可以参考:http://icolorbox.blog.163.com/blog/static/1960101312012850498446/

    下载文件并显示进度

NSURL *url = [NSURL URLWithString: @"http://119.147.106.249/gdown_group11/M00/3F/15/d5Nq-UxBq88AAAAAAUn8QBO4rlY4306605/01_01_Android%E5%B9%B3%E5%8F%B0%E4%B8%80%E6%97%A5%E6%B8%B8.mp4?k=-4hoIXm9CXQ_Zo79EQprcQ&t=1346820047&u=3662410469-66934941-bei9apjt&s=307200&file=01_01_Android%E5%B9%B3%E5%8F%B0%E4%B8%80%E6%97%A5%E6%B8%B8.mp4"];

    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval: 100.0];//设置缓存和超时

    NSURLConnection *connection = nil;

    connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];

      //初始化connection对象并马上执行,有的初始化方法并不是马上开始执行,而需要调用start方法。

    

二、实现connection的回调方法:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

{//该方法在响应connection时调用

    NSLog(@"response");

    self.data = [[NSMutableData alloc] init];

    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;

    if(httpResponse && [httpResponse respondsToSelector:@selector(allHeaderFields)]){

        NSDictionary *httpResponseHeaderFields = [httpResponse allHeaderFields];

        mFileSize = [[httpResponseHeaderFields objectForKey:@"Content-Length"] longLongValue];

    }//获取文件文件的大小

}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

{//出错时调用

    NSLog(@"error");

}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

{//接受数据,在接受完成之前,该方法重复调用

    NSLog(@"receive");

    [_data appendData: data];

    _displayLabel.text = [NSString stringWithFormat:(@"%6.1fkb/%6.1fkb"),[_data length]/1024.0,mFileSize/1024.0];

    [_progressView setProgress: [_data length]/(float)mFileSize];

}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

{//完成时调用

    NSLog(@"Finish");

    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"android.mp4"];

    [_data writeToFile:filePath atomically:NO];//将数据写入Documents目录。

    NSLog(@"%@",filePath);

}

    

 

    github上关于Restful风格访问客户端的示例,自己学习和理解:

    ios关于自己访问URL获取返回的方式为UIURLConnection,我们再次基础上,封装Request,使其包含Header的设置,封装Response获取响应等等。

   github地址:https://github.com/samvermette/SVHTTPRequest

 

    NSURLConnection :

    可以有两个办法让NSURLConnection在子线程中运行,即将NSURLConnection加入到run loop或者NSOperationQueue中去运行。

      可以将NSTimer手动加入NSRunLoop,Cocoa库也为其它一些类提供了可以手动加入NSRunLoop的方法,这些类有NSPort、NSStream、NSURLConnection、NSNetServices,方法都是[scheduleInRunLoop:forMode:]形式。我暂时只介绍下最常用的NSURLConnection类,看看如何把NSURLConnection的网络下载加入到其它线程的run loop去运行。

     

     如果NSURLConnection是在主线程中启动的,实际上它就在主线程中运行 -- 并非启动的另外的线程,但又具备异步运行的特性,这个确实是run loop的巧妙所在。如果对run loop有了初步的了解和概念后,实际上就能明白NSURLConnection的运行,实际也是需要当前线程具备run loop。

- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode; //将加入指定的run loop中运行,必须保证这时NSURLConnection不能启动,否则不起作用了

- (void)unscheduleFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode; //将取消在指定run loop中的运行,实际上就会停止NSURLConnection的运行

    

NSRunLoop *runloop; //global

[self performSelectorInBackground:@selector(thread) withObject:nil]; //启动包含run loop的线程

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; //注意这时不能先启动NSURLConnection

[conn scheduleInRunLoop:runloop forMode:NSRunLoopCommonModes]; //指定在上面启动的线程中运行NSURLConnection

[conn start]; //启动NSURLConnection

- (void)thread

{

  runloop = [NSRunLoop currentRunLoop]; //设置为当前线程的run loop值

  while (condition)

  {

    [runloop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]]; //启动run loop

  }

}

   将NSURLConnection加入到NSOperationQueue中去运行的方式基本类似:

NSOperationQueue *queue = [[NSOperationQueuealloc] init];

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; 

[conn setDelegateQueue:queue];

[conn start];

 

 

     github上的例子封装一次NSURLConnection连接访问为 一个NSOperation,封装为一次Request,为一个操作线程。在NSOperation内部通过NSURLConnection访问网络,发起异步下载等内容。

 

    

 

 

 

  

  

   

分享到:
评论

相关推荐

    NSURLConnection

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

    NSURLConnection类写的webservice调用类

    NSURLConnection是iOS开发中用于网络...对于现代的iOS开发,虽然NSURLSession已经取代了NSURLConnection,但理解NSURLConnection的原理和使用仍然是十分必要的,因为它可以帮助开发者更好地理解网络请求的底层机制。

    NSURLConnection使用demo

    然而,随着Swift的兴起和Apple推荐使用URLSession替代NSURLConnection,虽然NSURLConnection仍然是可用的,但在新项目中,我们应优先考虑使用URLSession,因为它提供了更好的性能和更多的功能,比如更好的线程管理、...

    使用NSURLConnection实现单点下载

    本篇文章将详细讲解如何利用NSURLConnection实现单点下载功能。 首先,我们需要理解NSURLConnection的工作原理。它是一个基于Objective-C的异步网络请求库,能够处理HTTP、HTTPS等各种协议。通过调用...

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

    2. **初始化`NSURLConnection`**:使用`NSURLConnection`的`initWithRequest:delegate:startImmediately:`方法初始化连接,传入请求对象和代理对象。 3. **代理方法**: - `connection:didReceiveResponse:`:在这...

    通过 NSURLConnection 进行异步下载

    同时,为了优化性能和用户体验,可以考虑使用`NSURLSession`代替`NSURLConnection`,因为前者提供了更多的功能和更好的性能。但`NSURLConnection`对于简单的异步下载任务仍然是一个有效且实用的选择。

    iOS基础——网络请求之NSURLConnection、NSURLSessionDataTask

    创建一个NSURLConnection请求的基本步骤如下: 1. 创建一个NSURL对象,表示请求的目标URL。 2. 创建一个NSMutableURLRequest对象,设置请求的HTTP方法(GET、POST等)和其他参数。 3. 如果需要发送数据,可以使用...

    Phone 网络开发之如何使用NSURLConnection

    NSURLConnection IPhone 网络开发之如何使用

    将类似NSURLConnection的同步任务引入NSURLSession

    在iOS和macOS开发中,网络请求是应用与服务器交互的关键环节。早期,Objective-C的开发者通常使用NSURLConnection来...使用NSURLSession进行同步任务比NSURLConnection更加灵活和高效,是Objective-C开发者的理想选择。

    swift-基于NSURLConnectionNSURLSessionAFNetworking方式实现文件下载功能

    3. 创建`NSURLConnection`实例,将请求和委托传递给它。 4. 在下载完成后,处理保存的文件,并释放连接。 然后,`NSURLSession`是苹果推荐的现代网络编程接口,具有更强大的功能和更高的性能。`NSURLSession`支持...

    iOS中使用NSURLConnection处理HTTP同步与异步请求

    在iOS7后,NSURLSession基本代替了NSURLConnection进行网络开发,在iOS9后,NSURLConnection相关方法被完全的弃用,iOS系统有向下兼容的特性,尽管NSURLConnection已经被弃用,但在开发中,其方法依然可以被使用,...

    封装网络请求类--AFNetworking、NSURLConnection

    封装`NSURLConnection`时,我们需要创建一个请求对象,设置请求头和参数,然后通过代理方法监听网络请求的状态,如请求开始、结束、数据接收等。回调通常通过实现`NSURLConnectionDataDelegate`和`...

    certificatepinner:与NSUrlSession和NSUrlConnection一起使用的证书固定的Swift实现

    与NSURLSession和NSURLConnection一起使用的证书固定的Swift实现 。 2017年1月9日:针对Swift 3.0进行了更新。 如果您想使用 2018-07-25:已针对Swift 4.0更新。 如果您想使用 如果您不使用或 ,则证书固定会非常...

    iOS开发中使用NSURLConnection类处理网络请求的方法

    在iOS开发中,NSURLConnection是Objective-C中处理网络请求的核心组件,它允许应用程序与服务器进行交互,发送HTTP请求并接收响应。...不过,对于新项目,建议使用NSURLSession,因为它提供了更多的功能和更好的性能。

    在iPhone应用程序中使用RESTful服务(bit.ly)

    在iOS应用中使用RESTful服务,需要掌握基本的Objective-C语法和类库,如NSURLConnection或NSURLSession用于网络请求,以及NSJSONSerialization用于解析JSON数据。 3. **创建网络请求**:在Objective-C中,可以使用`...

    NSURLProtocolDemo:使用NSURLConnection和NSURLSession的NSURLProtocol演示

    在`NSURLConnection`和`NSURLSession`这两个网络请求库中,`NSURLProtocol`都能发挥关键作用。 **1. NSURLConnection与NSURLSession简介** `NSURLConnection`是早期的网络请求API,它通过代理方法回调来处理网络...

    URLConnection实现图片下载

    在iOS开发中,`NSURLConnection`是Objective-C中用于网络通信的一个重要组件,尤其是在处理HTTP请求时。...但请注意,对于现代iOS应用开发,更推荐使用`NSURLSession`,因为它提供了更多的功能和更好的性能。

    ios开发实例WebService

    总结,"ios开发实例WebService"是一个实用的学习资源,它覆盖了iOS应用通过WebService获取数据的关键技术,包括RESTful API的使用、网络请求的创建与发送、数据的解析和UI展示。深入研究这个项目,将有助于提升你在...

Global site tag (gtag.js) - Google Analytics