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。

您可以创建一个由块捕获的会话令牌,而不是超时,然后,在启动解析器以及处理和返回数据之前,您可以检查会话令牌是否仍然有效。每次启动请求时,将会话令牌存储在实例变量中,以便您可以将其与块捕获的令牌进行比较。