2017-01-13 19 views
-1

Так что может возникнуть такой вопрос, но я не смог найти подобный.Подождите, пока пользователь не ответит на экранное представление, а затем выполнит код

В основном, что я пытаюсь сделать, пользователь будет получать приглашение с другого устройства. Затем появится представление, которое будет отображаться поверх текущего представления, чтобы пользователь принял или отклонил приглашение.

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

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

Вот мой код, который находится в пределах метода:

 DispatchQueue.global().async(execute: { 

      DispatchQueue.main.sync { 
       print("\(#file) > \(#function) > In new thread: \(Thread.current)") 

       let popOverView = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "IncomingCall") as! IncomingCallViewController 
       self.addChildViewController(popOverView) 

       popOverView.peerIndex = self.getIndexForPeer(peer: fromPeer) 
       popOverView.messages = self.messages 

       popOverView.view.frame = self.view.frame 
       self.view.addSubview(popOverView.view) 
       popOverView.didMove(toParentViewController: self) 

       print("\(#file) > \(#function) > Finished synchronized code on thread: \(Thread.current)") 
      } 

      print("\(#file) > \(#function) > \(Thread.current))") 
      // Need to execute some code HERE when the user responds 
     }) 

То, что я надеялся, что поток, который запускает код в: DispatchQueue.main.sync будет продолжать работать, когда новый поповер переехал родитель. Но это не так, и как только popOverView будет нажат на экран, тогда будет завершен окончательный оператор печати.

Кто-нибудь знает, как лучше всего действовать здесь?

Спасибо.

+0

Вы не должны использовать GCD для этого вообще. То, что вы можете сделать, это вызвать закрытие PopOver, вызванное пользователем, нажимая UIButton на PopOver. В этом закрытии вы выполнили свое действие. – mattsson

+0

@mattsson Хммм. Хорошо, мне придется искать закрытие, я никогда не использовал их раньше. Следует также отметить, что когда пользователь нажимает кнопку «Принять», PopOverView исчезает, а затем нам нужно выполнить segue для другого представления. Это что-то меняет? – Logan

+0

Ну, вам не нужно использовать закрытие. Возможно, было бы разумнее просто установить целевой и селектор, т. Е. Метод, который будет срабатывать при нажатии UIButton ('addTarget: action: forControlEvents:'). Все в порядке, что представление исчезает, пока вы устанавливаете другое представление в качестве цели UIButton. – mattsson

ответ

2

Do не использовать потоки и не «ждать». Никогда больше никогда не «ждать». Программирование iOS - управляемое событиями. Ваша задача - организовать ваш код, который будет вызываться в ответ на соответствующие/желаемые события.

Если пользователь принимает приглашение, мне нужно, чтобы выполнить действие

Затем реагировать на пользователя, нажав на кнопку Accept, выполняя это действие. Это так просто.

В целом, так выглядит поведение UIAlertController. Никакой код не приостанавливается или не «ждет» только потому, что предупреждение поднято. Ваш код отвечает на событие пользователя, то есть пользователь вводит кнопку в предупреждении.

+0

Но могу ли я вызвать метод из другого представления, когда пользователь нажимает кнопку? И в моем случае, когда нажата кнопка, мне нужно вернуться к предыдущему виду, а затем перейти к другому виду, возможно ли это? – Logan

+0

Конечно, все возможно. – matt