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 未被调用的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发系列-NSURLSession

学习NSURLSession

NSURLSession各文件关系

iOS开发-NSURLSession

NSURLSession学习

iOS开发 GETPOST请求方法:NSURLSession篇