我不确定为什么我的应用因为"请求超时而导致崩溃"错误。这对我来说绝对没有意义,因为我得到了我期待的数据回复。
某些背景信息:
每次用户滚动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)
})
}
}
答案 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中没有要检索的数据的区域时,由于我的代码结构,服务器不会发回响应。
请原谅我的无知,我对这些东西还是新手!非常感谢!