IOS网络访问之NSURLSession

NSURLSession是IOS7中新添加的网络访问接口,作用与NSURLConnection一致,在程序在前台时,NSURLSession与NSURLConnection可以互为替代工作。如果用户强制将程序关闭,NSURLSession会断掉。

NSURLSession中关键类有下面几种

1:NSURLSessionConfiguration:用于配置NSURLSession工作模式以及网络设置

工作模式分为下面三种:

普通模式(default):可以使用缓存

+ (NSURLSessionConfiguration *)defaultSessionConfiguration;

瞬时模式(ephemeral):不使用缓存

+ (NSURLSessionConfiguration *)ephemeralSessionConfiguration;

后台模式(background):当按下home键后仍然可以在后台进行上传下载操作,需要通过唯一的identity标示

+ (NSURLSessionConfiguration *)backgroundSessionConfiguration:(NSString *)identifier;

网络设置:

@property BOOL allowsCellularAccess   允许使用蜂窝数据

@property (getter=isDiscretionary) BOOL discretionary  YES时表示任务后台运行时自动选择最佳的网络选择(综合考虑网络,电量)

2:NSURLSession:获取NSURLSession有下面几种方式

+ (NSURLSession *)sharedSession  共享的会话,使用全局的Cookie,缓存数据

+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration  使用配置好的NSURLSessionConfiguration获得会话

+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(id <NSURLSessionDelegate>)delegate delegateQueue:(NSOperationQueue *)queue  与第2中相似,但是指定了委托

3:NSURLSessionTask:会话任务,通过NSURLSession创建,有下面3种常用子类

NSURLSessionDataTask:最普通的网络访问,与NSURLConnection使用方式相似,多用来获取xml或者json,可以通过NSURLSession的以下方法创建

- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request;

- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url

同时还可以通过block指定回调

- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler;

- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler;

NSURLSessionDownLoadTask:用来处理下载任务

- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request;

- (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)url;

- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData;

上面3种方法均可通过block设置回调,第三种方法可以实现断点续传

NSURLSessionUploadTask:用来处理上传任务,NSURLSessionDataTask的子类

- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL

- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(NSData *)bodyData

- (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request

上面3种方法同样可以通过block设置回调

创建后的NSURLSessionTask需要调用resume才会执行

4:NSURLSessionDelegate和NSURLSessionTaskDelegate协议

在网络请求的各个阶段都会触发协议的不同方法,具体使用方法可以参照后面例子

示例1:通过NSSessionDataTask访问网络数据

-(void)viewDidLoad {
    [super viewDidLoad];

    NSString *urlStr = @"http://localhost/iostest.php";
    urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    //创建request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlStr]];
    request.HTTPMethod = @"POST";
    request.HTTPBody = [@"name=zanglitao&gender=male" dataUsingEncoding:NSUTF8StringEncoding];

    //创建NSURLSession
    NSURLSession *session = [NSURLSession sharedSession];

    //创建任务
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    }];

    //开始任务
    [task resume];
}

示例2:通过NSSessionUploadTask上传文件,流程和NSURLConnection基本一致,关键点也是设置请求头参数和请求体拼接

//自定义一个boundary
#define boundary @"zanglitao"
@interface ZViewController()
@end

@implementation ZViewController

-(void)viewDidLoad {
    [super viewDidLoad];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://localhost/iostest.php"]];
    //必须使用POST
    request.HTTPMethod = @"POST";
    //设置请求体
    request.HTTPBody = [self getDataBody];
    //设置请求头
    [request setValue:[NSString stringWithFormat:@"%d",[self getDataBody].length] forHTTPHeaderField:@"Content-Length"];
    [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary] forHTTPHeaderField:@"Content-Type"];

    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionUploadTask *task = [session uploadTaskWithRequest:request fromData:[self getDataBody] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    }];

    [task resume];
}

//获取请求体内容
-(NSData *)getDataBody {
    NSMutableData *data = [NSMutableData data];

    NSString *top = [NSString stringWithFormat:@"--%@\nContent-Disposition: form-data; name=\"file\"; filename=\"1.png\"\nContent-Type: image/png\n\n",boundary];

    NSString *bottom = [NSString stringWithFormat:@"\n--%@--\n\n",boundary];

    NSData *content = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"1" ofType:@"png"]];

    [data appendData:[top dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:content];
    [data appendData:[bottom dataUsingEncoding:NSUTF8StringEncoding]];
    return data;
}

@end

示例3:使用NSURLSessionDownLoadTask下载文件

-(void)viewDidLoad {
    [super viewDidLoad];

    NSURLSession *session = [NSURLSession sharedSession];

    NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:@"http://g.hiphotos.baidu.com/image/pic/item/e61190ef76c6a7efc0a0e1ebfffaaf51f2de667c.jpg"] completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
       //下载完成后文件位于location处,我们需要移到沙盒中
        NSString *dirPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
        NSString *path = [dirPath stringByAppendingPathComponent:@"1.jpg"];

        NSFileManager *manager = [NSFileManager defaultManager];
        if ([manager fileExistsAtPath:path isDirectory:NO]) {
            [manager removeItemAtPath:path error:nil];
        }

        [manager moveItemAtPath:[location path] toPath:path error:nil];

    }];

    //开始任务
    [task resume];
}

执行后我们看到沙盒中多了一张名为1.jpg的图片,这是我们下载的图片

上面的代码还有一点问题,就是下载过程中没有进度提示只能干等,我们可以通过设置委托获取下载进度

示例4:使用委托查看下载进度

@interface ZViewController()<NSURLSessionDelegate>
@end

@implementation ZViewController

-(void)viewDidLoad {
    [super viewDidLoad];

    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

    //使用配置的NSURLSessionConfiguration获取NSSession,并且设置委托
    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];

    NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:@"http://g.hiphotos.baidu.com/image/pic/item/e61190ef76c6a7efc0a0e1ebfffaaf51f2de667c.jpg"] ];

    //开始任务
    [task resume];
}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
      didWriteData:(int64_t)bytesWritten
 totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
    float percent = (float)totalBytesWritten/totalBytesExpectedToWrite;
    NSLog(@"%f",percent);
}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location {
    NSString *dirPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
    NSString *path = [dirPath stringByAppendingPathComponent:@"1.jpg"];

    NSFileManager *manager = [NSFileManager defaultManager];
    if ([manager fileExistsAtPath:path isDirectory:NO]) {
        [manager removeItemAtPath:path error:nil];
    }
    [manager moveItemAtPath:[location path] toPath:path error:nil];
}

//任务结束
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error {
    NSLog(@"%s",__func__);
}

@end

2014-11-08 14:11:44.146 IOS网络请求[2366:3507] 0.020172

2014-11-08 14:11:44.147 IOS网络请求[2366:3507] 0.100307

2014-11-08 14:11:44.148 IOS网络请求[2366:3507] 0.153730

2014-11-08 14:11:44.148 IOS网络请求[2366:3507] 0.180442

2014-11-08 14:11:44.149 IOS网络请求[2366:3507] 0.207153

2014-11-08 14:11:44.150 IOS网络请求[2366:3507] 0.236461

2014-11-08 14:11:44.156 IOS网络请求[2366:3507] 0.263173

2014-11-08 14:11:44.160 IOS网络请求[2366:3507] 0.289884

2014-11-08 14:11:44.160 IOS网络请求[2366:3507] 0.316596

2014-11-08 14:11:44.161 IOS网络请求[2366:3507] 0.343307

2014-11-08 14:11:44.162 IOS网络请求[2366:3507] 0.370019

2014-11-08 14:11:44.162 IOS网络请求[2366:3507] 0.476865

2014-11-08 14:11:44.163 IOS网络请求[2366:3507] 0.557000

2014-11-08 14:11:44.169 IOS网络请求[2366:3803] 0.610423

2014-11-08 14:11:44.170 IOS网络请求[2366:3803] 0.663846

2014-11-08 14:11:44.171 IOS网络请求[2366:3803] 0.690558

2014-11-08 14:11:44.175 IOS网络请求[2366:3803] 0.717269

2014-11-08 14:11:44.176 IOS网络请求[2366:3803] 0.743981

2014-11-08 14:11:44.176 IOS网络请求[2366:3803] 0.797404

2014-11-08 14:11:44.177 IOS网络请求[2366:3803] 0.850827

2014-11-08 14:11:44.178 IOS网络请求[2366:3803] 0.877539

2014-11-08 14:11:44.179 IOS网络请求[2366:3803] 0.904250

2014-11-08 14:11:44.180 IOS网络请求[2366:3803] 0.930962

2014-11-08 14:11:44.180 IOS网络请求[2366:3803] 0.957674

2014-11-08 14:11:44.180 IOS网络请求[2366:3803] 0.984385

2014-11-08 14:11:44.181 IOS网络请求[2366:3803] 1.000000

2014-11-08 14:11:44.182 IOS网络请求[2366:3803] -[ZViewController URLSession:task:didCompleteWithError:]

下载是个漫长的过程,尤其是对于比较大的文件,所以我们还需要一个取消下载的按钮

示例5:示例4添加取消下载功能

@interface ZViewController()<NSURLSessionDelegate>
@property(nonatomic,strong)NSURLSessionDownloadTask *task;

@end

@implementation ZViewController

-(void)viewDidLoad {
    [super viewDidLoad];

    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

    //使用配置的NSURLSessionConfiguration获取NSSession,并且设置委托
    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];

    _task = [session downloadTaskWithURL:[NSURL URLWithString:@"http://yinyueshiting.baidu.com/data2/music/46729925/13125209147600128.mp3?xcode=10d30604371d01ea5cfa24abb2db23a644b52c81891b10c8"] ];

    //开始任务
    [_task resume];
}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
      didWriteData:(int64_t)bytesWritten
 totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
    float percent = (float)totalBytesWritten/totalBytesExpectedToWrite;
    NSLog(@"%f",percent);
}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location {
    NSString *dirPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
    NSString *path = [dirPath stringByAppendingPathComponent:@"1.mp3"];

    NSFileManager *manager = [NSFileManager defaultManager];
    if ([manager fileExistsAtPath:path isDirectory:NO]) {
        [manager removeItemAtPath:path error:nil];
    }

    [manager moveItemAtPath:[location path] toPath:path error:nil];
}

//任务结束
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error {
    NSLog(@"%s",__func__);
}

- (IBAction)cancelDownload:(id)sender {
    [_task cancel];
}

@end

2014-11-08 14:25:28.351 IOS网络请求[2451:3803] 0.000917

2014-11-08 14:25:28.359 IOS网络请求[2451:3507] 0.008676

2014-11-08 14:25:28.370 IOS网络请求[2451:1303] 0.010250

2014-11-08 14:25:28.379 IOS网络请求[2451:5407] 0.018904

2014-11-08 14:25:28.393 IOS网络请求[2451:3507] 0.022838

2014-11-08 14:25:28.393 IOS网络请求[2451:3507] 0.023625

2014-11-08 14:25:28.405 IOS网络请求[2451:3507] 0.030705

2014-11-08 14:25:28.405 IOS网络请求[2451:3507] 0.034639

2014-11-08 14:25:28.409 IOS网络请求[2451:1303] 0.035032

2014-11-08 14:25:28.414 IOS网络请求[2451:5407] 0.035426

2014-11-08 14:25:28.436 IOS网络请求[2451:3507] 0.035819

2014-11-08 14:25:28.479 IOS网络请求[2451:3507] -[ZViewController URLSession:task:didCompleteWithError:]

当按下取消按钮时下载停止,同时任务结束的方法被触发

当然现实中更常见的方式是任务停止下载后还能恢复下载

示例6:暂停与恢复

- (IBAction)pauseDownload:(id)sender {
    [_task suspend];
}

- (IBAction)continueDownload:(id)sender {
    [_task resume];
}

有时候我们暂停了任务然后退出了程序,如果希望下次进入程序后还能继续下载,那就需要实现断点下载功能,在NSURLConnection中可以利用请求头的Range参数实现断点下载,在NSURLSession中实现断点下载更加简单

示例7:断点下载

@interface ZViewController()<NSURLSessionDelegate>

@property (strong, nonatomic)NSURLSessionDownloadTask *task;
//存储已下载的数据
@property(nonatomic,strong)NSData *data;
@end

@implementation ZViewController

-(void)viewDidLoad {
    [super viewDidLoad];

    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

    //使用配置的NSURLSessionConfiguration获取NSSession,并且设置委托
    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
    _task = [session downloadTaskWithURL:[NSURL URLWithString:@"http://yinyueshiting.baidu.com/data2/music/46729925/13125209147600128.mp3?xcode=10d30604371d01ea5cfa24abb2db23a644b52c81891b10c8"] ];

    //开始任务
    [_task resume];
}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
      didWriteData:(int64_t)bytesWritten
 totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
    float percent = (float)totalBytesWritten/totalBytesExpectedToWrite;
    NSLog(@"%f",percent);
}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location {
    NSString *dirPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
    NSString *path = [dirPath stringByAppendingPathComponent:@"1.mp3"];

    NSFileManager *manager = [NSFileManager defaultManager];
    if ([manager fileExistsAtPath:path isDirectory:NO]) {
        [manager removeItemAtPath:path error:nil];
    }

    [manager moveItemAtPath:[location path] toPath:path error:nil];
}

//任务结束
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error {
    NSLog(@"%s",__func__);
}

- (IBAction)pauseDownload:(id)sender {
    [_task cancelByProducingResumeData:^(NSData *resumeData) {
        _task = nil;
        _data = resumeData;
    }];
}

- (IBAction)continueDownload:(id)sender {
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];

    _task = [session downloadTaskWithResumeData:_data];
    [_task resume];
}

@end

示例8:后台下载

@implementation ZViewController

-(void)viewDidLoad {
    [super viewDidLoad];

    NSURLSession *session = [self session];
    NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:@"http://yinyueshiting.baidu.com/data2/music/46729925/13125209147600128.mp3?xcode=10d30604371d01ea5cfa24abb2db23a644b52c81891b10c8"] ];

    //开始任务
    [task resume];
}

//后台会话(保证只有一个后台会话)
-(NSURLSession *)session {
    static NSURLSession *session;
    static dispatch_once_t token;
    dispatch_once(&token, ^{

        //后台下载
        NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"zang"];
        configuration.discretionary = YES;

        //使用配置的NSURLSessionConfiguration获取NSSession,并且设置委托
        session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
    });

    return session;
}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
      didWriteData:(int64_t)bytesWritten
 totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
    float percent = (float)totalBytesWritten/totalBytesExpectedToWrite;
    NSLog(@"%f",percent);
}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location {
    NSString *dirPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
    NSString *path = [dirPath stringByAppendingPathComponent:@"1.mp3"];

    NSFileManager *manager = [NSFileManager defaultManager];
    if ([manager fileExistsAtPath:path isDirectory:NO]) {
        [manager removeItemAtPath:path error:nil];
    }

    [manager moveItemAtPath:[location path] toPath:path error:nil];
}

//任务结束
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error {
    NSLog(@"%s",__func__);
}
@end

启动程序后按下home键发现下载进度信息不再更新,静候片刻再进入程序发现沙盒中多了1.mp3,使用backgroundSessionConfiguration可以使我们的下载任务运行在后台

我们也可以通过委托在文件下载完后进行界面更新

示例9:后台下载任务监控

当在后台下载完成后会触发AppDelegate的

- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler方法

- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler {
    NSLog(@"%@:download complete",identifier);

    self.handler = completionHandler;
}

此方法包含一个competionHandler(此操作表示应用完成所有处理工作),通常我们会保存此对象;直到最后一个任务完成,此时会重新通过会话标识(上面sessionConfig中设置的)找到对应的会话并调用NSURLSession的-(void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session代理方法,在这个方法中通常可以进行UI更新,并调用completionHandler通知系统已经完成所有操作

@implementation ZViewController

-(void)viewDidLoad {
    [super viewDidLoad];

    NSURLSession *session = [self session];
    NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:@"http://yinyueshiting.baidu.com/data2/music/46729925/13125209147600128.mp3?xcode=10d30604371d01ea5cfa24abb2db23a644b52c81891b10c8"] ];

    //开始任务
    [task resume];
}

//后台会话(保证只有一个后台会话)
-(NSURLSession *)session {
    static NSURLSession *session;
    static dispatch_once_t token;
    dispatch_once(&token, ^{

        //后台下载
        NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"zang"];
        configuration.discretionary = YES;

        //使用配置的NSURLSessionConfiguration获取NSSession,并且设置委托
        session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
    });

    return session;
}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
      didWriteData:(int64_t)bytesWritten
 totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
    float percent = (float)totalBytesWritten/totalBytesExpectedToWrite;
    NSLog(@"%f",percent);
}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location {
    NSLog(@"%s",__func__);
    NSString *dirPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
    NSString *path = [dirPath stringByAppendingPathComponent:@"1.mp3"];

    NSFileManager *manager = [NSFileManager defaultManager];
    if ([manager fileExistsAtPath:path isDirectory:NO]) {
        [manager removeItemAtPath:path error:nil];
    }

    [manager moveItemAtPath:[location path] toPath:path error:nil];
}

//任务结束
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error {
    NSLog(@"%s",__func__);
}

- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session {
    NSLog(@"%s",__func__);

    ZLTAppDelegate *appDelegate = (ZLTAppDelegate *)[UIApplication sharedApplication].delegate;
    void(^handler)() = appDelegate.handler;
    appDelegate.handler = nil;
    handler();
}

@end

2014-11-08 16:35:38.553 IOS网络请求[5149:1303] 0.018046

2014-11-08 16:35:38.554 IOS网络请求[5149:1303] 0.018117

2014-11-08 16:35:38.632 IOS网络请求[5149:3d07] 0.036427

2014-11-08 16:35:38.633 IOS网络请求[5149:3d07] 0.036606

2014-11-08 16:35:38.719 IOS网络请求[5149:4707] 0.054916

2014-11-08 16:35:38.719 IOS网络请求[5149:4707] 0.055094

2014-11-08 16:35:38.813 IOS网络请求[5149:1303] 0.073583

2014-11-08 16:35:38.814 IOS网络请求[5149:1303] 0.092072

2014-11-08 16:35:38.881 IOS网络请求[5149:3d07] 0.110560

2014-11-08 16:35:46.697 IOS网络请求[5149:607] zang:download complete

2014-11-08 16:35:46.701 IOS网络请求[5149:1303] -[ZViewController URLSession:downloadTask:didFinishDownloadingToURL:]

2014-11-08 16:35:46.703 IOS网络请求[5149:1303] -[ZViewController URLSession:task:didCompleteWithError:]

2014-11-08 16:35:46.703 IOS网络请求[5149:1303] -[ZViewController URLSessionDidFinishEventsForBackgroundURLSession:]

执行程序后按下home键,静静等待下载完成后发现虽然程序处于后台,但委托的3个方法均得到了执行

时间: 2024-10-27 16:50:12

IOS网络访问之NSURLSession的相关文章

IOS网络访问之使用AFNetworking

IOS网络访问之使用AFNetworking AFNetworking是IOS上常用的第三方网络访问库,我们可以在github上下载它,同时github上有它详细的使用说明,最新的AFNetworing2.0与1.0有很大的变化,这里仅对2.0常用的使用方法进行总结 基于NSURLConnection的API 提交GET请求 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [man

IOS网络访问之使用AFNetworking&lt;2&gt;

IOS网络访问之使用AFNetworking AFNetworking是IOS上常用的第三方网络访问库,我们可以在github上下载它,同时github上有它详细的使用说明,最新的AFNetworing2.0与1.0有很大的变化,这里仅对2.0常用的使用方法进行总结 基于NSURLConnection的API 提交GET请求 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [man

iOS网络编程(六) NSURLSession详解

昨夜浏览Demo的时候,看到别人请求网络数据用的是NSURLSession,当时就在想这里什么,怎么没有用过,引起了我的好奇心,遂去百度-谷歌-官方文档一一查看,有了一定的了解,原来NSURLSession是iOS7中新的网络接口,它与咱们熟悉的NSURLConnection是并列的. 查找资料,写了一个小Demo,大家可以看看,有什么不足的地方,可以留言帮我指出来. // // HMTRootViewController.m // // // Created by HMT on 14-6-7.

IOS网络访问之NSURLConnection

IOS网络访问主要建立在http协议上 IOS提供了几个重要的对象完成http请求响应 NSURLRequest:代表一个请求,通过NSURLRequest可以设置请求的URL地址以及缓存策略 NSMutableURLRequest:NSURLRequest的子类,可以方便地设置请求头的各种信息以及请求方式 NSURLConnection:网络访问对象,可以通过同步或者异步的方式发送请求 - (void)viewDidLoad { [super viewDidLoad]; // Do any a

ios网络访问接口-NSURLSession与NSURLConnection的区别

AFNetworking是日常开发中最常用的网络框架,现在我们使用的版本是3.0版,3.0与2.0版最大的区别就是,AFNetworking 2.0使用NSURLConnection的基础API ,而3.0是完全基于NSURLSession的API,已经抛弃了NSURLConnection.而NSURLSession可以看作是是NSURLConnection 的替代者,在2013年苹果全球开发者大会(WWDC2013)随ios7一起发布,是对NSURLConnection进行了重构优化后的新的网

IOS网络访问之获取网络状态

苹果设备的网络状况多变,既可能有网,也可能网络断开,既可能通过wifi联网,也可能通过蜂窝数据联网,很多时候我们需要获知程序当前运行在何种网络状况下 我们可以在苹果官方下载工具类Reachability,解压后将Reachability.h和Reachability.m添加到我们的项目中 示例1:查看当前的网络环境(通过访问一个页面测试网络状况) Reachability *reach = [Reachability reachabilityWithHostName:@"http://www.c

iOS 网络编程:NSURLSession

NSURLSession类和相关的类提供很多API来下载HTTP的内容.这些API提供多种delegate协议来支持验证和执行后台下载任务. 1 URL Session 设计概念 Session中的任务行为依赖三件事: Session类型:在创建时,由configuration 对象决定: task类型:数据传输类型: session执行方式:有前台和后台两种方式. 1.1 Session类型(3种)     NSURLSession API提供三种类型的session,而这三种类型是在创建时由

iOS网络2——NSURLSession

原文在此 一.整体介绍 NSURLSession在2013年随着iOS7的发布一起面世,苹果对它的定位是作为NSURLConnection的替代者,然后逐步将NSURLConnection退出历史舞台.现在使用最广泛的第三方网络框架:AFNetworking.SDWebImage等等都使用了NSURLSession.作为iOS开发人员,应该紧随苹果的步伐,不断的学习,无论是软件的更新.系统的更新.API的更新,而不能墨守成规. Session翻译为中文意思是会话,我们知道,在七层网络协议中有物理

IOS网络开发NSURLSession详解(一)概述

原创blog,转载请注明出处blog.csdn.net/hello_hwc 我的IOS-SDK详解专栏,欢迎关注 http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html 前言: 这个IOS网络编程的系列计划6篇文章,NSURLSession3篇(一篇概述,一篇详细阐述三种task和delegate的使用,一篇阐述授权,证书等内容),网络的基础知识两篇(一篇REST API讲解已经写完了,一篇我会把写博客的过程中遇到的概念总结出来