【问题标题】:NSURLSessionDataDelegate method didReceiveData and others are not calledNSURLSessionDataDelegate 方法 didReceiveData 等没有被调用
【发布时间】:2015-01-07 21:02:49
【问题描述】:

我遇到了没有调用 didReceiveData 和 didCompleteWithError 的问题。这是我的代码:

class LoginViewController: UIViewController, NSURLSessionDataDelegate, NSURLSessionDelegate, NSURLSessionTaskDelegate {
.
.
.
}

@IBAction func loginAction(sender: AnyObject) {

    var sessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()

    var session = NSURLSession(configuration: sessionConfiguration, delegate: self, delegateQueue:nil)

    let postParams = "email="+"rabcd@gmail.com&password="+"abcd"

    let url = NSURL(string:"http://myurl.com/api/v1/user/login")
    let request = NSMutableURLRequest(URL: url!)

    request.HTTPMethod = "POST"

    request.HTTPBody = postParams.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)

    let task = session.dataTaskWithRequest(request)


    task.resume()


}

这些是我实现的委托

func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) {

}

func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {

}

func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {

}

这里我用断点观看

didReceiveResponse 被调用,但其他两个没有被调用。

请帮忙!

【问题讨论】:

  • 你有解决办法吗?我也遇到了同样的情况
  • 您可以为此使用完成处理程序。

标签: swift ios8.1


【解决方案1】:

在您的委托方法中实现完成处理程序

func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) {
completionHandler(NSURLSessionResponseDisposition.Allow) //.Cancel,If you want to stop the download
}

【讨论】:

  • 完成处理程序效果很好,我已经知道了,但我想使用委托方法。
  • 要使其他委托方法工作,您应该使用 NSURLSessionResponseDisposition.Allow 调用完成处理程序
  • 一定会试试的:)
  • 通过提供指向 Apple 文档相关部分的链接来扩展此答案 - developer.apple.com/library/mac/documentation/Foundation/…:
【解决方案2】:

我会确认一下 ChezhianNeo 关于使用 NSURLSessionResponseAllow 调用 didRecieveResponse 委托的 completionHandler 的评论,如下所示

- (void) URLSession:(NSURLSession *)session dataTask:    (NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {

completionHandler(NSURLSessionResponseAllow);
}

这使得 didRecieveData 委托方法也可以被调用。

还有什么作用,至少它对我有用,就是不要在你的委托中实现 didReceiveResponse 方法,而是实现 didReceiveData 方法——“跳过”didReceiveResponse 方法允许调用 didReceiveData 方法,这不会似乎很有意义,但确实有效。

【讨论】:

  • 你有例子吗?
【解决方案3】:

对于其他人:
就我而言,即使在我之后也没有调用委托 didReceiveData
1.在NSURLSession中设置代理。
2. 使用 NSURLSessionResponseAllow 实现 didReceiveResponse

原因:
将 dataTaskWithRequest 与 完成处理程序 一起使用可防止调用委​​托。
您必须使用 dataTaskWithRequest 没有完成才能使用 NSURLSession 委托。

【讨论】:

  • 如果没有完成,我将如何访问数据和/或错误?
猜你喜欢
  • 2012-06-11
  • 1970-01-01
  • 2012-10-30
  • 2012-03-13
  • 2014-06-02
  • 2011-08-28
  • 2017-02-24
  • 2015-02-23
相关资源
最近更新 更多