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 NSDataNSJSONSerialization.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
相关文章推荐
- Swift开发教程--如何对字符串进行md5加密
- swift之函数式编程(二)
- 一些Swift小知识点的整理
- SwiftCommon之Camera相机
- SwiftCommon之Image
- SwiftCommon之Message弹窗
- SwiftCommon之Location位置
- SwiftCommon之String字符串
- SwiftCommon之Path路径
- SwiftCommon之Dictionary字典
- SwiftCommon之Device设备信息
- SwiftCommon之日期Date
- SwiftCommon之Cookie处理
- Swift:subscript
- OC和swift互相调用。
- swift 之函数式编程(一)
- Swift入门(一)——基本语法
- swift2 运算符函数
- iOS编程——Swift实现常见的递归算法(爬楼梯)2
- 基于swiftype应用于Hexo-Yilia-主题的站内搜索引擎