NSURLSession 的自动完成功能在网速较慢的情况下效果不佳
Autocomplete with NSURLSession doesn't work well with slow internet connection
我有一个searchBar
。当您输入 searchBar
(至少 3 个字符)时,带有 searchString
的请求将发送到服务器。此服务器响应 XML。这个 XML 被解析了。向用户显示一个列表。
每次用户在搜索栏中输入时,都会发送一个新请求并显示一个新列表。
这是我的部分代码:
let url = NSURL(string: "\(Paises.sharedInstance.getUrlPaisActual())?tipo=3&v=3&p=\(Paises.sharedInstance.getIdPaisActual())&texto=\(searchString)")
let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
let parser = NSXMLParser(data: data)
parser.delegate = self
parser.parse()
}
task.resume()
这在网络良好的情况下效果很好。但是当网络速度慢时,响应不会按照提交的顺序到达。
我该如何解决这个问题?我能知道回复是否过时吗?也许有超时?
谢谢。
更新了 Wain 的回答:
这是我存储令牌的静态变量。
struct RequestToken {
static var identificador = 0
func incrementar() -> Int {
return ++RequestToken.identificador
}
}
这是新请求:
let url = NSURL(string: "\(Paises.sharedInstance.getUrlPaisActual())?tipo=3&v=3&p=\(Paises.sharedInstance.getIdPaisActual())&texto=\(searchString)")
let identificador = RequestToken().incrementar()
let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
if identificador == RequestToken.identificador {
let parser = NSXMLParser(data: data)
parser.delegate = self
parser.parse()
}
}
task.resume()
非常感谢 Wain。
您可以创建一个由块捕获的会话令牌,而不是超时,然后,在启动解析器以及处理和返回数据之前,您可以检查会话令牌是否仍然有效。每次启动请求时,将会话令牌存储在实例变量中,以便您可以将其与块捕获的令牌进行比较。
我有一个searchBar
。当您输入 searchBar
(至少 3 个字符)时,带有 searchString
的请求将发送到服务器。此服务器响应 XML。这个 XML 被解析了。向用户显示一个列表。
每次用户在搜索栏中输入时,都会发送一个新请求并显示一个新列表。
这是我的部分代码:
let url = NSURL(string: "\(Paises.sharedInstance.getUrlPaisActual())?tipo=3&v=3&p=\(Paises.sharedInstance.getIdPaisActual())&texto=\(searchString)")
let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
let parser = NSXMLParser(data: data)
parser.delegate = self
parser.parse()
}
task.resume()
这在网络良好的情况下效果很好。但是当网络速度慢时,响应不会按照提交的顺序到达。
我该如何解决这个问题?我能知道回复是否过时吗?也许有超时?
谢谢。
更新了 Wain 的回答:
这是我存储令牌的静态变量。
struct RequestToken {
static var identificador = 0
func incrementar() -> Int {
return ++RequestToken.identificador
}
}
这是新请求:
let url = NSURL(string: "\(Paises.sharedInstance.getUrlPaisActual())?tipo=3&v=3&p=\(Paises.sharedInstance.getIdPaisActual())&texto=\(searchString)")
let identificador = RequestToken().incrementar()
let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
if identificador == RequestToken.identificador {
let parser = NSXMLParser(data: data)
parser.delegate = self
parser.parse()
}
}
task.resume()
非常感谢 Wain。
您可以创建一个由块捕获的会话令牌,而不是超时,然后,在启动解析器以及处理和返回数据之前,您可以检查会话令牌是否仍然有效。每次启动请求时,将会话令牌存储在实例变量中,以便您可以将其与块捕获的令牌进行比较。