解除模态视图控制器暂时冻结应用程序,swift 3

时间:2017-01-18 17:42:04

标签: ios swift3 modalviewcontroller

在我的应用程序中,我有一个视图控制器,我以模态方式呈现。在这个视图控制器中我有一个表视图。每当用户在表视图中进行选择时,我都会关闭视图控制器。

问题在于,即使调用了解雇功能,有时视频控制器也不会在长时间延迟(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")
    }
}

这样做是否有任何伤害?

4 个答案:

答案 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时存在正交问题。...