я пытаюсь создать простой поиск пользователей, используя запросы сервера. Я отправляю запрос на получение каждый раз, когда изменяется текст панели поиска. Что я хочу сделать, так это отменить предыдущие задачи/соединения при вызове нового. (Каждый раз, когда я нажимаю клавишу клавиатуры). Я использую NSURLSession. Приложение просто вылетает, когда я отменяю задачи. Вот мой код.
var dataTask : NSURLSessionDataTask?
func searchUsers(){
if (self.dataTask && self.dataTask!.state == NSURLSessionTaskState.Running){
self.dataTask!.suspend()
self.dataTask!.cancel()
self.dataTask = nil
println("taskRunning")
}
let url:NSURL = NSURL(string: "http://192.168.0.7:3000/users?n=\(searchBox.text.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet()))")
println(searchBox.text)
self.dataTask = NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: {(data, response, error) in
userSearch.removeAll(keepCapacity: true)
var jsonResult:NSArray = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSArray
println(self.dataTask!.state)
println(error)
for index in 0...jsonResult.count-1 {
var resultDictionary: NSDictionary = jsonResult[index] as NSDictionary
userSearch.append(User(name: "user" as NSString, id: resultDictionary["_id"] as NSString))
}
dispatch_async(dispatch_get_main_queue(), {self.resultsTable.reloadData()})
})
self.dataTask!.resume()
}
index
- я сомневаюсь у вас столько разделов - это случайные данные. Я подозреваю, что лучшим подходом может быть запуск таймера, скажем, на 1 или 2 секунды, когда поле поиска изменяется, и перезапуск его, если они изменяют поле поиска. Когда таймер истечет, выполните поиск в веб-службе и дайте ему завершиться, даже если поле поиска снова изменится. - person Paulw11   schedule 28.08.2014