【问题标题】:NSURLSession dataTaskWithRequest not being calledNSURLSession dataTaskWithRequest 未被调用
【发布时间】: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 函数不会触发?

【问题讨论】:

    标签: swift nsurlsession


    【解决方案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 完全错过了您的问题,抱歉(我知道现在已经很晚了)。但是,是的,上面的代码运行良好,只是服务器请求需要一段时间才能响应数据。如果我进一步追求这一点,一个更好的解决方案是将请求分解为多个较小数据量的请求。因此,与其请求所有日期(在本例中),我可能会一次请求三个月,并分别处理每个块。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-25
      • 1970-01-01
      相关资源
      最近更新 更多