我正在使用Dispatch Semaphore等待我发出URL JSON请求,这种等待可能需要一段时间。为了克服这种情况,我决定制作一个新视图,并在请求发出时将其显示为弹出窗口。为此,我使用了以下代码:
# Function to get legend from a ggplot as a separate graphical object
# Source: https://github.com/tidyverse/ggplot2/wiki/Share-a-legend-between-two-ggplot2-graphs/047381b48b0f0ef51a174286a595817f01a0dfad
g_legend<-function(a.gplot){
tmp <- ggplot_gtable(ggplot_build(a.gplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
return(legend)
}
# Get legend
leg = g_legend(plot_list[[1]])
# Lay out all of the plots together with a single legend
grid.arrange(arrangeGrob(grobs=lapply(plot_list, function(x) x + guides(colour=FALSE))),
leg,
ncol=2, widths=c(10,1))
showPopUp执行的地方:
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函数仅在de request已经发出并且弹出视图刚刚在屏幕上闪烁时才被调用。如何在请求之前调用它?
答案 0 :(得分:2)
问题是wait
将阻塞主线程,直到信号量执行signal
,阻塞进程中的UI(以及其他内容)。
我建议您完全消除该信号量。 (无论如何,这通常是一种非常糟糕的做法。)只需在启动异步请求之前显示弹出窗口并在完成处理程序中将其关闭(如果完成处理程序没有,则确保将其分发到主队列中) ; t在主线程上运行。)