使用的 Xcode 16.2 、swift 6.0.3
代码如下
import Foundation
DispatchQueue.global().async {
// 耗时操作(如网络请求、文件处理)
let data = downloadData()
DispatchQueue.main.async {
updateUI(with: data)
}
}
func downloadData() -> String{
sleep(2)
return "a"
}
func updateUI(with: Any) {
print("updateUI")
}
sleep(10)
为什么我无法输出 updateUI
我应该如何在切换到主线程时候,让主线程输出 updateUI
![]() |
1
kera0a 19 天前 via iPhone
主线程已经提前被 sleep(10)阻塞了,等 sleep 结束后程序估计也终止了
|
2
iOCZS 19 天前
主线程如何保持运行?
|
![]() |
3
byby 19 天前 via iPhone
老方法用闭包 completion ,新方法用 async await
|
![]() |
4
iyeatse 19 天前 ![]() 把 `sleep(10)` 改成 `dispatchMain()`
|
5
MacsedProtoss 19 天前
main:|——————————( sleep 10)——————————|
dispatchGlobal. print(“updateUI”) global: ——(sleep 2)——| dispatchMain 为啥你要在主线程 sleep 阻塞住它呢? |
6
MacsedProtoss 19 天前
@MacsedProtoss 奇怪…好像空格都被吃掉了,我的 format 全都失效了….
|
![]() |
7
chiaf 19 天前 via iPhone
看描述,这好像是全部代码,没有 main 函数怎么运行🤪
如果是在 playground 里面,肯定能打印出来。 |
![]() |
8
yoyoyoyolol 18 天前
你给的代码由于 sleep(10)卡住主线程了,导致 10 秒后才能打印 updateUI 。
因为 palyground 没有 runloop 环境,你要想实现 2 秒后打印的效果,可以这样写 import Foundation import PlaygroundSupport // 关键导入 // 让 Playground 持续运行,不自动结束 PlaygroundPage.current.needsIndefiniteExecution = true DispatchQueue.global().async { // 耗时操作(如网络请求、文件处理) let data = downloadData() DispatchQueue.main.async { updateUI(with: data) } } func downloadData() -> String { sleep(2) return "a" } func updateUI(with: Any) { print("updateUI") } // 不需要 sleep(10),Playground 会保持运行 其中 PlaygroundPage.current.needsIndefiniteExecution = true 这一句话可以让 palyground 开启 runloop 环境,避免了主线程使用 sleep 卡住线程 |
![]() |
9
magic3584 18 天前
看着像是在 Playground 里。
建议创建一个项目在 viewController 里去调用 |
10
shixiaoda 18 天前
看到 iOS developer 后继有人,甚是欣慰
|
![]() |
14
main1234 OP @MacsedProtoss 萌新,我想让主线程不退出
|
15
MacsedProtoss 18 天前 via iPhone
@main1234 主线程不退出是 runloop 机制实现的 如果你用纯 swift cli 去跑那肯定不行
|
![]() |
16
BeiChuanAlex 2 天前
@shixiaoda #10 哈哈哈,笑死了,宗门已经没落成这样了嘛
|