2016-10-10 3 views
2

Я пытаюсь выполнить segue для нового контроллера представлений, но segue вызывается дважды, а новый контроллер представления появляется дважды.
Я использую метод, который выполняет запрос GET API для извлечения данных.
Этот метод использует обработчик завершения.segue вызывается дважды при использовании DispatchQueue.main.async

func getSearchResultsForQuery(_ query: String, completionHandlerForSearchResultsForQuery: @escaping (_ success: Bool, _ error: NSError?) -> Void) 

Когда метод завершен успешно, мой вызов вызывается изнутри основной очереди, как требуется.

Я установил точки останова, чтобы я мог видеть, что происходит, и выполнение переходит от выполнения функции до состояния, которое проверяет, был ли метод успешным, а затем продолжается до тех пор, пока вызов не будет вызван во второй раз.
Я пробовал чисто программный переход, но результат был тот же.
Я также добавил оператор печати, и, если я прокомментирую segue, оператор print вызывается только один раз.

Я использовал этот же шаблон несколько раз раньше и никогда не имел проблемы с ним, и я просто не могу понять, почему это происходит.
Единственное, что я делаю разные на этот раз использует Swift 3 и использование DispatchQueue.main.async вместо dispatch_async (dispatch_get_main_queue()

Вот функция, которая дает мне эту проблему:.

@IBAction func search(_ sender: UIButton) { 

     let searchQuery = searchField.text 

     TIClient.sharedInstance().getSearchResultsForQuery(searchQuery!) { (success, error) in 

      if success { 
       print("Food items fetch successful") 
       DispatchQueue.main.async { 
        print("Perorming segue for food item: \(searchQuery)") 
        self.performSegue(withIdentifier: "showFoodItems", sender: self) 
       } 
      } else { 
       print("error: \(error)") 
      } 
     } 
} 

Редактирование: я никогда не узнал, в чем проблема, но полностью удалил рассказную доску и воссоздал ее.

ответ

0

Я знаю, что это не отличный способ исправить эту проблему. Также я не могу оставить комментарий из-за к низкой репутации, но что произойдет, если вы завернете весь оператор if в DispatchQueue.main?

@IBAction func search(_ sender: UIButton) { 

    let searchQuery = searchField.text 

    TIClient.sharedInstance().getSearchResultsForQuery(searchQuery!) { (success, error) in 
    DispatchQueue.main.async { 
     if success { 
     print("Food items fetch successful") 
     self.performSegue(withIdentifier: "showFoodItems", sender: self) 
     } else { 
     print("error") 
     } 
    } 
} 

Это даст другой результат или все тот же результат? проверка для Bool не требует слишком большой вычислительной мощности, поэтому я не думаю, что положить ее в основную очередь - это плохо, но я сделал бы это, чтобы не справиться с проблемой. Извините, я не могу просто прокомментировать это.

+0

Я только что пробовал это, но это вызывает ошибку с запросом URL-адреса GET. – lxirsh

0

Проверьте раскадровку, возможно, вы установили segue из своей кнопки вместо контроллера.

+0

Я проверил и перепроверял раскадровку. Я даже удалил сериал раскадровки и попробовал программный сеанс. Все еще была та же проблема, – lxirsh

Смежные вопросы