我一直在尝试实现NSURLSessionDataDelegate,特别是修改响应中收到的HTTP标头中的缓存策略。
要做到这一点,我尝试在使用willCacheResponse方法缓存之前拦截proposedResponse,但它不会被调用。
我查看了这个网站和其他人,但我仍然不确定为什么函数willCacheResponse没有被调用。
有什么想法吗?
class ViewController: UIViewController, NSURLSessionDelegate, NSURLSessionDataDelegate, NSURLSessionTaskDelegate {
override func viewDidLoad() {
super.viewDidLoad()
let requestUrl = "https://www.google.com/data.json"
let request = NSURLRequest(URL: NSURL(string: requestUrl)!)
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(
configuration: configuration,
delegate: self,
delegateQueue: NSOperationQueue.mainQueue()
)
let task = session.dataTaskWithRequest(request) {
data, response, error in
//print(data)
print(response)
//print(error)
}
task.resume()
}
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, willCacheResponse proposedResponse: NSCachedURLResponse, completionHandler: (NSCachedURLResponse?) -> Void) {
print("willCacheResponse")
completionHandler(proposedResponse)
}
}
答案 0 :(得分:2)
class ViewController: UIViewController, NSURLSessionDelegate, NSURLSessionDataDelegate, NSURLSessionTaskDelegate {
var session:NSURLSession!
override func viewDidLoad() {
super.viewDidLoad()
let requestUrl = "https://www.google.com"
let request = NSURLRequest(URL: NSURL(string: requestUrl)!)
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
self.session = NSURLSession(
configuration: configuration,
delegate: self,
delegateQueue: NSOperationQueue.mainQueue()
)
let task = session.dataTaskWithRequest(request)
task.resume()
}
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {
print("Did receive data!")
}
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) {
print("Response!!")
}
}
答案 1 :(得分:2)
尝试:
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) {
completionHandler(.Allow)
}
这对我有用,现在调用其他委托方法。
答案 2 :(得分:1)
并非每个响应都被缓存: "使用有效的NSCachedURLResponse来调用完成例程 *允许缓存结果数据,或传递nil以防止 *缓存。请注意,无法保证缓存 *尝试使用给定的资源,您不应该依赖于此 *用于接收资源数据的消息。"
尝试查看是否调用了委托的其他方法。
答案 3 :(得分:0)
尝试声明
会话
以外的
viewDidLoad中
方法
答案 4 :(得分:0)
您必须调用此方法(未完成):
let task = session.dataTaskWithRequest(request)
顺便说一下,您尝试访问的网址无效。 只需实现此方法,您将得到响应:
func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) {
print("Response!!")
}