不知道为什么NSURLSession超时

时间:2016-03-08 04:07:36

标签: ios node.js swift nsurlsession

我不确定为什么我的应用因为"请求超时而导致崩溃"错误。这对我来说绝对没有意义,因为我得到了我期待的数据回复。

某些背景信息:

每次用户滚动mapview时,我都会打电话给服务器以检索有关位置的一些信息,我相信这很好。我完成后是否需要关闭连接?是因为我滚动得太多而反过来我提出这么多请求它会压倒服务器吗?我完全不知道为什么会发生这种情况,但我确实知道我想要回来的数据是成功回来的,然后就是没有它会说“"请求超时"我response得到了一个零。以下是我的代码。谢谢!

此外,我如何处理超时请求,以便我的应用程序不会崩溃?

       let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in

        let httpResponse = response as? NSHTTPURLResponse

        if httpResponse?.statusCode != 200 {
            print(httpResponse?.statusCode)
        }

        if error != nil {
            print("Localized description error: \(error!.localizedDescription)")
        }

        do {
            //Store JSON data into dictionary
            self.locationsObjectDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSMutableDictionary

            //print(self.locationsObjectDictionary)

        } catch {
           print("JSON object could not be retrieved: \(error)")
        }
        completion()
    }

    // Start the session
    task.resume()
}

    let qos = DISPATCH_QUEUE_PRIORITY_HIGH
    let queue = dispatch_get_global_queue(qos, 0)

    dispatch_async(queue) {
        self.fetchLocations() {
            self.addLocationInfoToPins()

            dispatch_async(dispatch_get_main_queue(), {

                self.mapView.addAnnotations(self.locationPins)

            })
        }
    }

2 个答案:

答案 0 :(得分:2)

即使错误不是零,您也会解包数据。

NSJSONSerialization.JSONObjectWithData(数据!,选项:.MutableContainers)

这就是我的建议:

public typealias InternalCompletionHandler = (completionStatus: Bool, error: NSError? ) -> Void


func  post(urlStr: String, _ params: [String: String], _ action: JupiterAction, completionHandler: ) {
    let url = NSURL(string: urlStr)

    let session = NSURLSession(configuration: self.sessionConfig)

    let request = NSMutableURLRequest(URL: url!)

    let task = session.dataTaskWithRequest(request) { 
       (data, response, error) -> Void in

        let httpResponse = response as? NSHTTPURLResponse

        if httpResponse?.statusCode != 200 {
            print(httpResponse?.statusCode)
        }
        var itWorked = true
        if ( error != nil ) {
            print("Localized description error: \(error!.localizedDescription)")
            itWorked = false
        } else {
            do {
                //Store JSON data into dictionary
                self.locationsObjectDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSMutableDictionary
                //print(self.locationsObjectDictionary)

            } catch {
               print("JSON object could not be retrieved: \(error)")
               itWorked = false
            }
        }
        // Pass the error back up the line so you can present the user with some sensible feedback if you want.
        // Move this out here so pass or fail, the callback happens.
        completion(itWorked, error)
    }
}

如果出现错误,数据可能为零,无法解包。在我自己的应用程序中,我做同样的事情。我所做的是检查错误是否为零,如果是,那么我什么都不做。如果错误不是nil,那么处理数据是安全的。

答案 1 :(得分:0)

好的,所以我发现了问题所在!这不是客户端问题。在服务器上,如果没有返回结果,我不允许发生响应。因此,当用户滚动浏览mapview中没有要检索的数据的区域时,由于我的代码结构,服务器不会发回响应。

请原谅我的无知,我对这些东西还是新手!非常感谢!