NSURLSession 简单分析3

207 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

NSURLSession

NSURLSession是为了代替NSURLConnection而设计的。Sessions的所有工作都是通过它的小弟,也就是NSURLSessionTask的对象。可以用block,delegate,或者两者混合来创建task。举个例子,你要下载图片,就要创建NSURLSessionDownloadTask

首先需要创建session:

// 1NSString*imageUrl=@"http://www.raywenderlich.com/images/store/    iOS7_PDFonly_280@2x_authorTBA.png";// 2NSURLSessionConfiguration*sessionConfig=[NSURLSessionConfiguration defaultSessionConfiguration];// 3NSURLSession*session=[NSURLSession sessionWithConfiguration:sessionConfig                            delegate:selfdelegateQueue:nil];

ok,这个看上去和前面的只有点不同,一步一步看:

这里下载一张图片。

创建NSURLConfiguration

用当前类对象作为代理创建session。

之后,通过创建带有完成处理的task来下载图片:

// 1NSURLSessionDownloadTask*getImageTask=[session downloadTaskWithURL:[NSURL URLWithString:imageUrl]completionHandler:^(NSURL*location,NSURLResponse*response,NSError*error){// 2UIImage*downloadedImage=[UIImage imageWithData:[NSData dataWithContentsOfURL:location]];//3dispatch_async(dispatch_get_main_queue(),^{// do stuff with image_imageWithBlock.image=downloadedImage;});}];// 4[getImageTask resume];

很好,现在看起来像网络请求代码了!

task由session创建。上面是创建了一个基于block的方法。你还可以用NSURLSessionDownloadDelegate跟踪下载进度:

URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:

通过location变量来得到image指针。

然后是更新UIImageView的图片。

开始这个task。

session能够轻松的创建task,并发送到代理方法,通知你完成。

这是像上面使用相同的session:

// 1NSURLSessionDownloadTask*getImageTask=[session downloadTaskWithURL:[NSURL URLWithString:imageUrl]];[getImageTask resume];

如果你接下来什么都不做的话,我们就使用这些代码。那么,就需要实现这个协议中的代理方法NSURLSessionDownloadDelegate。首先是,收到下载完成的通知:

-(void)URLSession:(NSURLSession*)session downloadTask:(NSURLSessionDownloadTask*)downloadTask didFinishDownloadingToURL:(NSURL*)location{// use code above from completion handler }

这里再一次给你提供了location,然后用它就能获取image。

最后,如果需要跟踪下载进度:

-(void)URLSession:(NSURLSession*)session    downloadTask:(NSURLSessionDownloadTask*)downloadTask    didWriteData:(int64_t)bytesWrittentotalBytesWritten:(int64_t)totalBytesWrittentotalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{NSLog(@"%f / %f",(double)totalBytesWritten,(double)totalBytesExpectedToWrite);}

NSURLSessionTask

上面看了NSURLSessionDataTaskNSURLSessionDownloadTask的使用。这两个都是继承至NSURLSessionTask

image.png

NSURLSessionTask是session中task的基类,它们只能由session或session的子类创建。

NSURLSessionDataTask

这个task调用HTTP GET请求从服务器获取数据。返回的数据格式是NSData。可能需要你自己转换成XML,JSON,UIimage等..

NSURLSessionDataTask*jsonData=[session dataTaskWithURL:yourNSURL  completionHandler:^(NSData*data,NSURLResponse*response,NSError*error){// handle NSData}];

NSURLSessionUploadTask

这个类是上传用的,在数据传输过程中,这个代理方法能观察网络状况。

上传一张图片:

NSData*imageData=UIImageJPEGRepresentation(image,0.6);NSURLSessionUploadTask*uploadTask=[upLoadSession uploadTaskWithRequest:request fromData:imageData];

这个task由session创建,上传图片的NSData。其他上传方法还有上传文件,或是数据流。

NSURLSessionDownloadTask

NSURLSessionDownloadTask下载文件更简单,可以在下载中挂起,恢复。它有一点点不同于其他两个子类。

task的类型直接写到一个临时文件中。

下载过程中会调用URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite: 去更新状态。

当task完成,URLSession:downloadTask:didFinishDownloadingToURL:会被调用。此时你可以将临时文件保存到永久文件中。

下载失败或是取消还可以得到已经下载的那一部分数据。

使用这个挂起task:

//[uploadTask resume];  [uploadTask suspend];

同时管理多个task时,可以用taskIdentifier属性来唯一标识task。

现在了解了NSURLSession类套中主要的类。