使用NSURLSession来做网络传输,基本步骤:
- 创建NSURLSessionConfiguration对象;
- 创建NSURLSession对象;
- 创建NSURLRequest对象,准备NSURL,或NSData;(可选)
- 创建NSURLSessionTask对象;
- 通过delegate来监控网络传输的过程;
可以创建3类NSURLSessionConfiguration对象:
- defaultSessionConfiguration: configure一个有disk cache的session object,类似于NSURLConnection,用这种configuration传教的session object会把communication credientials 存在keychain中
- ephemeralSessionConfiguration: configure一个有RAM cache的session object, 当你要下载非常小,临时的数据时可以使用,一旦session结束,connect credentials 会被丢弃
- backgroundSessionConfigurationWithIdentifier: 容许你创建一个用系统进程的下载/上传进程,即使你的app没有运行,也可以进行下载/上传, 除非用户手动将app杀掉
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.timeoutIntervalForRequest = 15.0
- timeoutIntervalForRequest参数是经常会改到的参数,表示session等待的app和服务器之间通讯的时间,单位是s。 一般的default值时60s
创建一个NSURLSession对象
session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
- delegate是了解session的通讯和下载/上传任务的窗口,比如:下载了多少,有错误发生
- delegateQueue是sessiontask执行的queue, 如果是nil,那么系统会任意找一个thread运行
NSURLSessionTask
NSURLSessionTask是一个抽象子类,它有三个具体的子类是可以直接使用的:NSURLSessionDataTask,NSURLSessionUploadTask和NSURLSessionDownloadTask。
let task = session?.dataTaskWithURL(url!, completionHandler:nil)
task?.resume()
//task结束以后调用
session.finishTasksAndInvalidate()
对应有3类delegate的方法,例如:
//接收到数据的时候
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData)
//下载完成的时候
func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?)
例子:
//不断添加下载数据到mutableData,在下载完成后取消sessionTask
var mutableData = NSMutableData()
override func viewDidLoad() {
super.viewDidLoad()
let url = NSURL(string: “http://bookapi.bignerdranch.com/courses.json“)
let task = session?.dataTaskWithURL(url!, completionHandler:nil)
task?.start()
}func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {
data.enumerateByteRangesUsingBlock {[weak self] (pointer, range, stop) -> Void in
let newData = NSData(bytes: pointer, length: range.length)
self!.mutableData.appendData(newData)
}
}func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {
session.finishTasksAndInvalidate()
dispatch_async(dispatch_get_main_queue(), {[weak self] () -> Void in
var message = “Finished downloading your content”
if error != nil {
message = “Failed to download your content”
}
self!.displayAlertWithTitle(“Done”, message: message)
})
}
定制URL request
用NSMutableURLRequest来代替NSURLRequest,NSMutableURLRequest可以在初始化后做更改
let url = NSURL(string: “http://bookapi.bignerdranch.com/courses.json“)
let request = NSMutableURLRequest(URL: url!)
request.HTTPMethod = “POST”
用NSJSONSerialization来serialize/deserialize Json 对象
//NSDictionary(AnyObject) to NSData
NSJSONSerialization.dataWithJSONObject(dictionary, options: .PrettyPrinted, error: &error)
//NSData to NSDictionary(AnyObject)
NSJSONSerialization.JSONObjectWithData(jsonData!, options: .AllowFragments, error: &error)
dataWithJSONObject 的Option 是NSJSONWritingOptions,只有一个选择。
而JSONObjectWithData的Option由下列值组成,可以mix在一起:
- NSJSONReadingMutableContainers: JSONObjectWithData 返回一个Mutable的Array或者Dictionary,反之是immutable的
- NSJSONReadingMutableLeaves: Leaf values会包裹在一个NSMutableString里面
- NSJSONReadingMutableContainers: 容许转化一个顶层对象不是Array或者dictionary的Json data