`

实战iOS7之NSURLSession

阅读更多
NSURLSession VS NSURLConnection
NSURLSession可以看做是NSURLConnection的进化版,其对NSURLConnection的改进点有:

  • * 根据每个Session做配置(http header,Cache,Cookie,protocal,Credential),不再在整个App层面共享配置.
  • * 支持网络操作的取消和断点续传
  • * 改进了授权机制的处理
  • * 丰富的Delegate模型
  • * 分离了真实数据和网络配置数据。
  • * 后台处理上传和下载,即使你点击了“Home”按钮,后台仍然可以继续下载,并且提供了根据网络状况,电力情况进行处理的配置。

知识点



用法
使用NSURLSession的一般套路如下:
  • 1. 定义一个NSURLRequest
  • 2. 定义一个NSURLSessionConfiguration,配置各种网络参数
  • 3. 使用NSURLSession的工厂方法获取一个所需类型的NSURLSession
  • 4. 使用定义好的NSURLRequest和NSURLSession构建一个NSURLSessionTask
  • 5. 使用Delegate或者CompletionHandler处理任务执行过程的所有事件。

实战
这儿我简单的实现了一个下载任务的断点续传功能,具体效果如下:



实现代码如下:
#import "UrlSessionDemoViewController.h"

@interface UrlSessionDemoViewController ()

@end

@implementation UrlSessionDemoViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.progressBar.progress = 0;
}


- (NSURLSession *)session
{
    //创建NSURLSession
    NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession  *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
    return session;
}

- (NSURLRequest *)request
{
    //创建请求
    NSURL *url = [NSURL URLWithString:@"http://p1.pichost.me/i/40/1639665.png"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    return request;
}

-(IBAction)start:(id)sender
{
    //用NSURLSession和NSURLRequest创建网络任务
    self.task = [[self session] downloadTaskWithRequest:[self request]];
    [self.task resume];
}

-(IBAction)pause:(id)sender
{
    NSLog(@"Pause download task");
    if (self.task) {
        //取消下载任务,把已下载数据存起来
        [self.task cancelByProducingResumeData:^(NSData *resumeData) {
            self.partialData = resumeData;
            self.task = nil;
        }];
    }
}

-(IBAction)resume:(id)sender
{
    NSLog(@"resume download task");
    if (!self.task) {
        //判断是否又已下载数据,有的话就断点续传,没有就完全重新下载
        if (self.partialData) {
            self.task = [[self session] downloadTaskWithResumeData:self.partialData];
        }else{
            self.task = [[self session] downloadTaskWithRequest:[self request]];
        }
    }
    [self.task resume];
}

//创建文件本地保存目录
-(NSURL *)createDirectoryForDownloadItemFromURL:(NSURL *)location
{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *urls = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];
    NSURL *documentsDirectory = urls[0];
    return [documentsDirectory URLByAppendingPathComponent:[location lastPathComponent]];
}
//把文件拷贝到指定路径
-(BOOL) copyTempFileAtURL:(NSURL *)location toDestination:(NSURL *)destination
{

    NSError *error;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    [fileManager removeItemAtURL:destination error:NULL];
    [fileManager copyItemAtURL:location toURL:destination error:&error];
    if (error == nil) {
        return true;
    }else{
        NSLog(@"%@",error);
        return false;
    }
}

#pragma mark NSURLSessionDownloadDelegate
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location
{
    //下载成功后,文件是保存在一个临时目录的,需要开发者自己考到放置该文件的目录
    NSLog(@"Download success for URL: %@",location.description);
    NSURL *destination = [self createDirectoryForDownloadItemFromURL:location];
    BOOL success = [self copyTempFileAtURL:location toDestination:destination];
    
    if(success){
//        文件保存成功后,使用GCD调用主线程把图片文件显示在UIImageView中
        dispatch_async(dispatch_get_main_queue(), ^{
            UIImage *image = [UIImage imageWithContentsOfFile:[destination path]];
            self.imageView.image = image;
            self.imageView.contentMode = UIViewContentModeScaleAspectFit;
            self.imageView.hidden = NO;
        });
    }else{
        NSLog(@"Meet error when copy file");
    }
    self.task = nil;
}

/* Sent periodically to notify the delegate of download progress. */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
      didWriteData:(int64_t)bytesWritten
 totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
    //刷新进度条的delegate方法,同样的,获取数据,调用主线程刷新UI
    double currentProgress = totalBytesWritten/(double)totalBytesExpectedToWrite;
    dispatch_async(dispatch_get_main_queue(), ^{
        self.progressBar.progress = currentProgress;
        self.progressBar.hidden = NO;
    });
}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
 didResumeAtOffset:(int64_t)fileOffset
expectedTotalBytes:(int64_t)expectedTotalBytes
{
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

@end

所有代码在这儿:https://github.com/xianlinbox/iOS7_New/tree/master/iOS7_New/NSURLSession/ViewController

参考文章:http://www.objc.io/issue-5/from-nsurlconnection-to-nsurlsession.html
http://www.shinobicontrols.com/blog/posts/2013/09/20/ios7-day-by-day-day-1-nsurlsession
  • 大小: 69.6 KB
  • 大小: 123.3 KB
2
0
分享到:
评论

相关推荐

    实战iOS7之后台多任务 - 我期望的世界 - ITeye技术网站1

    在iOS7及后续版本中,后台多任务处理能力得到了显著增强,这使得应用程序即使在后台也可以执行特定的任务,提升用户体验。本文将详细讲解iOS后台多任务的几个关键特性:后台任务(Background Task)、后台数据获取...

    iOS6 编程实战(英)

    《iOS 6编程实战》是一本面向iOS开发者的专业书籍,主要针对的是苹果公司在2012年发布的iOS 6操作系统。这本书以英文版的形式提供,深入探讨了在iOS 6平台上进行应用程序开发的各种技术和策略。虽然目前没有中文版,...

    iOS 7 Programming Cookbook

    《iOS 7 Programming Cookbook》是一本专为iOS开发者编写的实战指南,旨在帮助读者深入理解并熟练掌握iOS 7开发中的各种技术与技巧。这本书涵盖了众多主题,包括界面设计、多任务处理、通知机制、地理位置服务、动画...

    ios 豆瓣项目实战

    【标题】:“ios 豆瓣项目实战” 在这个“ios 豆瓣项目实战”中,我们将会深入探讨如何使用Xcode 6.4开发一个完整的iOS应用,以豆瓣为实际应用场景。Xcode 6.4是苹果公司提供的集成开发环境(IDE),用于构建iOS、...

    iOS开发练手项目(OC版)

    在iOS开发领域,Objective-C(OC)是一种...通过这个项目,开发者不仅可以巩固Objective-C语言基础,还能提升对iOS开发流程、UI设计、网络通信等方面的实战经验。对于想要深入iOS开发的人来说,这是一个很好的起点。

    ios应用源码之横条显示滚动的股票动态 2018128

    总的来说,这个"ios应用源码之横条显示滚动的股票动态"项目涵盖了iOS应用开发中的多个核心概念,包括界面设计、网络通信、数据处理、动画效果以及性能优化。通过研究这个项目,开发者可以深入理解iOS开发流程,并...

    企业级ios应用开发实战11

    在企业级iOS应用开发实战的第11章中,我们主要探讨了如何构建高效、稳定且用户友好的iOS应用程序,特别是在Xcode环境下使用Objective-C语言进行编程的技术与策略。这一章的内容涵盖了多个关键知识点,旨在提升开发者...

    IOS网络编程与云端应用

    书中首先介绍了iOS网络编程的基础知识,包括URL Loading System、NSURLSession、CFNetwork框架等。这些技术是iOS应用与服务器进行数据交互的核心,用于发送HTTP/HTTPS请求、下载文件、上传数据等。了解这些基础知识...

    黑马iOS入学面试知识点全总结

    以上知识点是黑马iOS入学面试的必备内容,通过深入学习和实践,将为你的iOS开发之路打下坚实的基础。这份内部绝密资料无疑是你进入iOS开发领域的关键,助力你轻松应对面试,成功加入"黑马"行列。

    ios开发视频教程

    - **UIKit框架**:UIKit是iOS应用程序的主要框架之一,提供了一系列构建用户界面的类库。了解如何使用UIKit创建视图、按钮、标签等UI组件。 #### 二、iOS应用开发核心概念 - **MVC设计模式**:Model-View-...

    ios5 programming-cookbook 源代码

    《iOS 5编程实战秘籍》源代码 这个压缩包包含的是《iOS 5 Programming Cookbook》一书的配套源代码,这本书是针对iOS开发者的宝贵资源,尤其对于那些正在学习和提升iOS 5应用程序开发技能的程序员来说。作者通过一...

    ios简历模板

    2. **MVC设计模式**: MVC(Model-View-Controller)是iOS应用中最常用的架构模式之一,它将数据模型、用户界面和业务逻辑分离,有助于保持代码的清晰和可维护性。 3. **单例模式**: 单例模式确保一个类只有一个实例...

    iOS开发指南:从零基础到App Store上架

    通过阅读《iOS开发指南:从零基础到App Store上架》这本书,开发者可以从基础理论到实战技巧全面掌握iOS开发,最终实现将自己创作的应用展示给全世界iOS用户的目标。书中详细讲解了每一个步骤,包括错误处理、性能...

    iOS.5.Programming.Cookbook清晰版(全)

    《iOS 5 Programming Cookbook》是一本专为iOS开发者编写的实战指南,旨在帮助读者深入理解并掌握iOS 5开发中的各种技术与技巧。这本书以英文原版的形式呈现,提供了清晰的排版和全面的内容,是iOS开发者的宝贵参考...

    ios应用源码之面试题讲解 20181210

    本压缩包"ios应用源码之面试题讲解 20181210"很可能包含了针对这些主题的详细解答和示例代码,帮助求职者更好地准备面试。 1. **Objective-C与Swift**:Objective-C是苹果的早期编程语言,而Swift是后来推出的现代...

    ios开发指南第五版

    - **UIKit框架介绍**:UIKit是iOS应用开发的核心框架之一,提供了构建用户界面所需的组件和API。本章将详细介绍UIKit框架的主要组成部分。 - **视图控制器**:讲解视图控制器的概念及其在iOS应用架构中的作用,包括...

    IOS 开发源码(爱限免)

    "爱限免"这款应用,作为iOS开发的一个实例,提供了宝贵的实战学习资源。下面我们将详细探讨其中涉及的关键知识点。 1. **网络连接**:在iOS开发中,网络请求通常使用`NSURLSession`或第三方库如Alamofire来实现。`...

    iOS5CookBook源码

    通过仔细分析和学习《iOS5 Cookbook源码》,开发者不仅可以掌握iOS 5的关键技术,还能了解到如何将理论知识应用于实际项目,提升自己的实战能力。无论你是初学者还是经验丰富的开发者,这份源码都能为你提供宝贵的...

    ios5 cookBook 源码

    《iOS 5编程实战指南》源码分析 在iOS开发领域,《iOS 5 Programming Cookbook》是一本备受开发者欢迎的书籍,它提供了丰富的示例代码和实用技巧,帮助开发者深入理解iOS平台上的应用开发。这份源码是书中的实践...

    IOS应用源码——steveturner-IOS-WhackJob-bak-03c0bdc.rar

    总的来说,"steve-turner的IOS-WhackJob"项目为iOS开发者提供了一个宝贵的实践平台,通过对源码的深入学习,我们可以掌握更多iOS开发的实战技巧,提升自己的编程能力。无论是对于新手还是经验丰富的开发者,这样的...

Global site tag (gtag.js) - Google Analytics