/* Page prose (zh-Hans) */
"WaitBlockingAlternative" = "# `wait()`：会阻塞的替代方案\n\n`notify` 交给你一个回调。有时你反而想在此处**停下来等待**，直到组变空为止。那就是 `wait()`，如下所示。";
"WaitBlockingAlternative-2" = "**观察运行：** 三行 `Finished:` 会打印出来（顺序任意），只有到那时 `All prep done` 才会打印。注意，你在这里**不**需要 `needsIndefiniteExecution`：`wait()` 会阻塞顶层代码直到工作完成，所以这一页不会提前结束。\n\n这份便利藏着一个陷阱。**`wait()` 会阻塞调用它的那个线程。** 在 Playground 的顶层代码里，那个线程就是主线程，而在这里阻塞它是无害的，因为没有别的东西需要它。**在真实的 app 里，在主线程上调用 `wait()` 会在整段时间内冻结 UI**，这正是前一章警告过你的那种冻结。修复方式是以下两者之一：\n\n* 优先用 `notify(queue:)`：它不阻塞，所以什么都不会冻结。\n* 如果你确实需要阻塞，就把等待放在**后台队列**上做，绝不要放在主线程上：\n\n```swift\nDispatchQueue.global().async {\n    group.wait()                 // block a background thread, fine\n    DispatchQueue.main.async {\n        print(\"Batch complete: now update the UI\")\n    }\n}\n```\n\n你还可以传入一个超时：`group.wait(timeout: .now() + 2)` 会返回 `.timedOut` 而不是永远等待，这是个好习惯，能让一个卡住的任务无法把你无限期地挂起。\n\n[上一页](@previous)  |  第 4 / 8 页  |  [下一页: 经典错误：enter/leave 不平衡](@next)";
