Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 等待调度信号时,将ViewController作为弹出窗口_Ios_Swift_View_Popup_Dispatch - Fatal编程技术网

Ios 等待调度信号时,将ViewController作为弹出窗口

Ios 等待调度信号时,将ViewController作为弹出窗口,ios,swift,view,popup,dispatch,Ios,Swift,View,Popup,Dispatch,我正在使用一个分派信号来等待发出一个URL JSON请求,而这个等待可能需要一段时间。为了克服这种情况,我决定创建一个新视图,并在发出请求时将其显示为弹出窗口。为此,我使用了以下代码: func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { self.showPopUp() let semaphore = DispatchSemaphore(value: 0) se

我正在使用一个分派信号来等待发出一个URL JSON请求,而这个等待可能需要一段时间。为了克服这种情况,我决定创建一个新视图,并在发出请求时将其显示为弹出窗口。为此,我使用了以下代码:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    self.showPopUp() 
    let semaphore = DispatchSemaphore(value: 0)

    self.api.requestMedicationsByReagent(method: 1, ean: "", hash: medHash!, gen: generic) { output in
        semaphore.signal()
        self.objects = output
    }
     // Thread will wait here until async task closure is complete
     let _ = semaphore.wait(timeout: DispatchTime.distantFuture)
}
showPopUp的作用是:

func showPopUp() {
    let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "loadingPopUp") as! PopUpViewController

    self.addChildViewController(popOverVC)
    popOverVC.view.frame = self.view.frame
    self.view.addSubview(popOverVC.view)
    popOverVC.didMove(toParentViewController: self)
}

问题是,showPopUp功能仅在发出de请求后才被调用,弹出视图仅在屏幕上闪烁。在请求之前如何调用它?

问题是
等待
将阻塞主线程,直到信号量执行
信号
,从而阻塞进程中的UI(除其他外)


我建议你完全去掉那个信号灯。(总之,这是一种非常糟糕的做法。)在启动异步请求之前显示弹出窗口,并在完成处理程序中关闭它(如果完成处理程序没有在主线程上运行,请确保将其分派到主队列)。

删除信号量的问题是,我在它之后执行了一个序列。如果我确实删除了,segue将在没有设置
self.objects=output
的情况下执行,我需要设置它,因为我将在其他视图控制器中使用此信息,以便从单元格中删除segue,而在视图控制器之间设置segue。然后,当您在完成处理程序中删除popover时,也可以通过编程执行segue。但是,如果您在主队列上等待,可能会影响需要主队列的任务的运行,从而引入死锁风险,如果在不合适的时间执行,iOS看门狗进程可能会杀死您的应用程序。通常情况下,您永远不想阻止主线程。谢谢,这很好!现在,我试图弄清楚为什么视图中的某些元素会被分割掉