您的位置:首页 > 移动开发 > Swift

Network(NSURLSession) - iOS 8 Swift Programming cookBook 读书笔记

2015-07-29 15:11 477 查看

使用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: