0

Я преследовал это в течение двух дней, но все же я до сих пор не уверен, почему моя переменная не передается в моем segue из моего контроллера входа в контроллер просмотра чата через навигационный контроллер.Segue async Firebase данные через NavigationController (Swift)

У меня есть кнопка, которая запрашивает Firebase, проверяет, существует ли пользователь и возвращает ссылку на запрос Firebase для пользователя. Затем я хочу передать эту ссылку на запрос Firebase, когда она заканчивается контроллером верхнего уровня контроллера навигации для использования.

Внутри моей кнопки входа IBAction, у меня есть:

var tempUserRef: FIRDatabaseReference? 

    channelRef.queryOrdered(byChild: "uid").queryEqual(toValue: uid).observeSingleEvent(of: .value, with: { (snapshot) in 
     if snapshot.exists() { 
      print("uid exist with \(snapshot.childrenCount) number of children") 

      for s in snapshot.children.allObjects as! [FIRDataSnapshot] { 
       tempUserRef = self.channelRef.child(s.key) 
      } 

     } else { 
      print("uid didn't exist") 

      if let name = self.nameField?.text { // 1 
       tempUserRef = self.channelRef.childByAutoId() 

       let channelItem = [ 
        "name": name, 
        "uid": self.uid 
       ] 
       tempUserRef?.setValue(channelItem) 
      } 
     } 
     self.userRef = tempUserRef 
     DispatchQueue.main.async { 
      self.performSegue(withIdentifier: "LoginToChat", sender: tempUserRef) 
      print("passsed \(self.userRef)") 

     } 
    }) 

Вот мой переход:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if "LoginToChat" == segue.identifier { 
      if let navVc = segue.destination as? UINavigationController { 
       if let chatVc = navVc.topViewController as? ChatViewController { 
        chatVc.senderDisplayName = nameField?.text 
        if let userRef = sender as? FIRDatabaseReference { 
         chatVc.userRef = userRef 
         print("passsing \(self.userRef) to \(chatVc)") 
        } 
       } 
      } 
     } 
     super.prepare(for: segue, sender: sender) 
    } 

инструкции печати все хорошо выглядеть на мой контроллер входа, но когда я получаю в представлении чате контроллера, userRef по-прежнему равен нулю. Поэтому я имею в виду, что у меня есть правильные входные данные и переключение каналов, но что асинхронный характер данных как-то несовместим с моим segue.

Контроллер просмотра чата использует библиотеку JSQMessages, если это имеет значение.

Благодарим за помощь.

EDIT: Основываясь на обратной связи, я переместил super.prepare, но userRef по-прежнему не устанавливается последовательно.

ВТОРОЙ РЕДАКТИРОВАНИЕ: Следуя предложению Павла, я удалил свою кнопку. Тем не менее, мне пришлось создать еще один сегмент, который подключил контроллер просмотра для просмотра контроллера, такого как SO question.

ответ

1

Поместите звонок в super.prepare в конце функции. В противном случае, segue выполняется перед установкой переменных.

+0

Я переместил его, но он все еще кажется не установленным. – micyukcha

+0

Я беру это обратно. Он прошел в 4 из 10 раз, когда я его запустил, так что происходит расовое состояние? Когда я просматриваю все свои точки останова, это выглядит так, как времена, которые прошли через точку останова внутри viewDidLoad на chatVc, задавали бы переменные. Те, которые его пропускают, этого не делают. – micyukcha

+0

Уверены ли вы, что у вас нет раскадровки, также проводной _up_ как ваш вызов 'performSegue'? У вас должен быть тот или другой. – paulvs

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