在我的应用程序中,我有一个视图控制器,我以模态方式呈现。在这个视图控制器中我有一个表视图。每当用户在表视图中进行选择时,我都会关闭视图控制器。
问题在于,即使调用了解雇功能,有时视频控制器也不会在长时间延迟(5-7秒)后被解雇或被解雇。
这是我的代码:
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
非常感谢任何帮助。
编辑:
我使用以下方法解决了这个问题:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
if tableView == self.quarterTableView
{
self.delegate?.modalViewController(modalVC: self, dismissedWithValue:self.quarterPeriods[indexPath.row])
}
else if tableView == self.monthTableView
{
self.delegate?.modalViewController(modalVC: self, dismissedWithValue: self.monthPeriods[indexPath.row])
}
Print("didSelectRowAt dismiss")
self.dismiss(animated: true) {
Print("finished")
}
}
这样做是否有任何伤害?
答案 0 :(得分:5)
如果您希望UI上的某些内容立即发生,请在主队列上执行
DispatchQueue.main.async(execute: {
self.dismiss(animated: true) {
Print("finished")
})
答案 1 :(得分:3)
尝试使用调度<!DOCTYPE html>
<html>
<head>
<title>Text</title>
<style type="text/css">
#box_one{
border: 1px solid black;
width: 400px;
margin: 10px auto 10px auto;
}
#box_one > div{
height: 200px;
border: 1px solid black;
margin: 10px auto 10px auto;
}
</style>
</head>
<body>
<div id="box_one">
<div></div>
</div>
</body>
</html>
DispatchQueue
答案 2 :(得分:2)
没有害处。你只需让主线程同时完成两个任务。
答案 3 :(得分:1)
这是一个旧线程,但可能会帮助其他人。
我最近遇到了相同的问题(使用XCode 10.1,Swift 4.2),发现,是的,上述将Dismiss包装在DispatchQueue.main.async中的解决方案是可行的。但是,这没有意义,因为执行清除的线程只能是主线程。
我的情况略有不同,因为我回叫了一个委托人(该委托人是首先显示模式视图的VC),但行为与OP的描述相同-如果我通过单击Cancel取消模式按钮,对撤消完成块的响应是瞬时的,而如果我通过在tableView中选择一行来撤消,则在执行撤消完成块之前会有7到10秒的延迟。在发出dismiss之前测试正在运行的线程以及在完成回调内部都显示它是主线程(实际上,它不能是其他任何线程。。。)。因此,虽然将解雇文件包装在DispatchQueue.main.async中显然可以正常工作,但这没有任何意义。
请参见下面的代码片段,在表视图中取消选择行的行的添加也解决了延迟问题。很奇怪。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
Logger.debug("In tableView delegate: didSelectRowAt")
selectedItem = discoveredPeripherals[indexPath.row][kPeripheralUuidKey] ?? nil
// Grabbing the data I need based on the selected row and then deselecting the row
// fixes the delay problem
tableView.deselectRow(at: indexPath, animated: false) // <<---- fixes the delay
discoveredPeripherals = []
if let dd = dismissalDelegate { dd.didCompletePresenting(viewController: self) }
else { self.dismiss(animated: true, completion: {
Logger.debug("Warning: Invalid (nil) dismissal delegate, dismissing self")
})
}
}
希望对某人有帮助...我从SO上的其他帖子中注意到,在基于tableView行选择呈现VC时存在正交问题。...