NSURLSessionDataDelegate未调用

时间:2015-12-09 15:22:39

标签: ios swift nsurlsession

我一直在尝试实现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)
}
}

5 个答案:

答案 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!!")
 }
相关问题