一起养成写作习惯!这是我参与「掘金日新计划 · 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
上面看了NSURLSessionDataTask和NSURLSessionDownloadTask的使用。这两个都是继承至NSURLSessionTask:
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类套中主要的类。