Быстрое время всплывающих окон и асинхронной отправки - PullRequest
0 голосов
/ 29 мая 2018

Я начинающий программист, у которого возникли проблемы с синхронизацией вызовов функций.Я хотел бы объяснить, почему это происходит, и как это исправить.Проблема возникает в сегменте кода, который запускается, когда одно всплывающее окно закрывается, и я хочу сначала открыть другое всплывающее окно, а затем после нажатия кнопки в новом всплывающем окне, я хочу, чтобы программа сделала что-то дополнительно в главном контроллере представления.Вот код (кто-то предложил использовать DispatchQue, но он, похоже, ничего не делает):

@objc func onPopupClosed() {
print("first")

DispatchQueue.main.async {
 if let vc = self.storyboard?.instantiateViewController (withIdentifier: 
    "P2CompetitionPopUpId") as? P2_Competition_Pop_Up 
            {
                vc.modalPresentationStyle = .overCurrentContext
                self.present(vc, animated: true, completion: nil)
            } else {
                print("error creating P2_Competion_Pop_Up")
            }
        }
print ("third")     
}

И P2_Competition_Pop_Up выглядит следующим образом:

class P2_Competition_Pop_Up: UIViewController {

 override func viewDidLoad() {
    super.viewDidLoad()

    //print("Second")
 }

@IBAction func Slot1(_ sender: Any) {

    //some code

    dismiss(animated: true, completion: nil)

}
}

Я хочу, чтобы эта программа получиласьв выводе «первый», «второй», «третий» (и печатать «третий» только после нажатия кнопки во всплывающем окне).Вместо этого он дает мне «первый», «третий», «второй».Зачем?И как мне это исправить?Является ли использование DispatchQue правильным способом или есть другой?

пс.оператор "print (" third ")" действительно является модификацией того, как выглядит основной вид.Я просто использовал это утверждение, чтобы подчеркнуть сложность порядка и упростить иллюстрацию.

1 Ответ

0 голосов
/ 30 мая 2018

Нет гарантии, что в вашем коде «Второй» или «Третий» будет напечатан первым.Но если вы хотите, чтобы что-то было сделано после того, как вы представили UIViewController, вы должны сделать это в блоке завершения present.

    if let vc = self.storyboard?.instantiateViewController (withIdentifier: "P2CompetitionPopUpId") as? P2_Competition_Pop_Up {
      vc.modalPresentationStyle = .overCurrentContext
      self.present(vc, animated: true, completion: {
          // do it here
          print ("third")     
      })
    } else {
      print("error creating P2_Competion_Pop_Up")
    }

Также вы можете написать в сахарном синтаксисе

      self.present(vc, animated: true) {
          print ("third")     
      }
...