NSURLSession dataTaskWithRequest 未被调用
Posted
技术标签:
【中文标题】NSURLSession dataTaskWithRequest 未被调用【英文标题】:NSURLSession dataTaskWithRequest not being called 【发布时间】:2014-11-21 04:00:00 【问题描述】:我有第二个 NSURLSession 直接从前一个的 completionHandler 调用(它取决于第一次调用生成的 cookie)。它工作了一段时间,有时仍然有效,但大部分时间都没有。当我通过调试器进行设置时,它只是从 dataTaskWithRequest 行转到 task.resume() 调用之后的行。有什么想法吗?
func getDates () -> [NSDate]
var urlDays = NSURL(string: "https://mycorrecturl.com")
var requestDays = NSMutableURLRequest(URL: urlDays!)
let sessionDays = NSURLSession.sharedSession()
// Create array of NSDate objects
var allDates = [NSDate]()
var task = sessionDays.dataTaskWithRequest(requestDays, completionHandler: data, response, error -> Void in
// Convert into array of NSDate objects
)
task.resume()
return allDates
为什么这个 dataTaskWithRequest 函数不会触发?
【问题讨论】:
【参考方案1】:您面临的问题是 dataTaskWithRequest 是一个异步调用,这就是您收到一个空数组的原因(这是完成并返回同一时间的唯一机会,有时您会收到数据)。
为此,您需要使用从 dataTaskWithRequests 的闭包中调用 get 的闭包。
像这样(这里我只给你展示带有闭包的声明方法):
func getDates (success:([NSDate])->Void)
在您的网络调用正文中:
var task = sessionDays.dataTaskWithRequest(requestDays, completionHandler: data, response, error -> Void in
// Convert into array of NSDate objects
var yourArrayOfNSDateConverted:[NSDate] = [NSDate]()
success(yourArrayOfNSDateConverted)
)
显然 yourArrayOfNSDateConverted 包含您的进程数据,并且您还需要管理错误(为此您可以添加另一个闭包)。
【讨论】:
【参考方案2】:看起来它正在发射,我只是等待的时间不够长。该函数返回调用函数时没有数据,但那是因为 NSURLSession 尚未完成。我想我仍然了解 NSURLSession 的异步特性。
【讨论】:
一两分钟。但我认为它会有所不同 - 自从它开始工作以来我一直没有计时,我的整个程序可能需要 10 分钟以上,所以很难说。 你是怎么解决的? @Kaptain 完全错过了您的问题,抱歉(我知道现在已经很晚了)。但是,是的,上面的代码运行良好,只是服务器请求需要一段时间才能响应数据。如果我进一步追求这一点,一个更好的解决方案是将请求分解为多个较小数据量的请求。因此,与其请求所有日期(在本例中),我可能会一次请求三个月,并分别处理每个块。以上是关于NSURLSession dataTaskWithRequest 未被调用的主要内容,如果未能解决你的问题,请参考以下文章