Swift падает при отмене предыдущей задачи и последующем создании новой. (сессия NSURLS)

я пытаюсь создать простой поиск пользователей, используя запросы сервера. Я отправляю запрос на получение каждый раз, когда изменяется текст панели поиска. Что я хочу сделать, так это отменить предыдущие задачи/соединения при вызове нового. (Каждый раз, когда я нажимаю клавишу клавиатуры). Я использую 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()
}

person Luis Grases    schedule 27.08.2014    source источник
comment
Что такое сообщение о сбое? Какая линия?   -  person Paulw11    schedule 28.08.2014
comment
я действительно не знаю, как понимать сообщения об ошибках xcode, вот что появляется bhx4x0ms7/   -  person Luis Grases    schedule 28.08.2014
comment
Я подозреваю, что происходит то, что вы освобождаете задачу данных в основном потоке, в то время как блок все еще выполняется в фоновом потоке, поэтому вы заканчиваете тем, что блок выполняется в освобожденной памяти - посмотрите на значение index - я сомневаюсь у вас столько разделов - это случайные данные. Я подозреваю, что лучшим подходом может быть запуск таймера, скажем, на 1 или 2 секунды, когда поле поиска изменяется, и перезапуск его, если они изменяют поле поиска. Когда таймер истечет, выполните поиск в веб-службе и дайте ему завершиться, даже если поле поиска снова изменится.   -  person Paulw11    schedule 28.08.2014
comment
Так много, эта альтернатива сработала очень хорошо   -  person Luis Grases    schedule 06.09.2014
comment
Вот реализация obj c. stackoverflow.com/questions/9642762/   -  person Prabhu.Somasundaram    schedule 23.02.2016