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

使用NSURLSession来做网络传输,基本步骤:

  1. 创建NSURLSessionConfiguration对象;
  2. 创建NSURLSession对象;
  3. 创建NSURLRequest对象,准备NSURL,或NSData;(可选)
  4. 创建NSURLSessionTask对象;
  5. 通过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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值