1

我正在重构/重写遗留应用程序中的一些代码,其中(有时)长时间运行查询。自定义视图控制器用于显示进度,当查询完成时,将显示另一个视图控制器的结果。

当前代码呈现进度 VC,然后启动查询任务,当查询完成时,它呈现结果 VC。问题是当查询任务通过通知中心发布成功通知时,进度 VC 被“自动”关闭。不用说,这不是很稳定,而且很多时候进度 VC 在结果 VC 出现之前没有及时关闭,导致 iOS 打印出严格的日志,没有结果 VC。

为了避免对代码进行大的更改(目前),我已经对其进行了更改,因此进度 VC 完全可以从呈现它的上下文中控制。但是我仍然需要等待它完全呈现,然后才能将其关闭,并且需要与查询同步,这可能比呈现时间执行得更快。

总结一下,这是我目前的想法,但我对有一个单独的任务只是为了同步并不满意。在“正常”并发环境中,我会使用二进制信号量或类似的,Swift 中是否有更清洁的解决方案?我正在寻找一种方法来向 Task 发出信号,表明present()-method 的完成处理程序已被调用。

let t = Task {
    // Wait longer than present(animated: true) time
    try await Task.sleep(nanoseconds: 10_000_000_000)
}

let controller = UIAlertController(title: "Progress", message: nil, preferredStyle: .alert)
self.present(controller, animated: true, completion: { t.cancel() })

Task {
    // Perform work that may take less or more time than presentation
    try await Task.sleep(nanoseconds: 10_000_000)
    
    // Wait until alert is fully presented (no wait if work time was long enough)
    let _ = await t.result

    // Cleanup
    controller.dismiss(animated: true, completion: nil)
    
    // Present work result view controller
    // ...
}
4

0 回答 0