
使用的 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 207 天前 via iPhone 主线程已经提前被 sleep(10)阻塞了,等 sleep 结束后程序估计也终止了 |
2 iOCZS 207 天前 主线程如何保持运行? |
3 byby 207 天前 via iPhone 老方法用闭包 completion ,新方法用 async await |
4 iyeatse 207 天前 把 `sleep(10)` 改成 `dispatchMain()` |
5 MacsedProtoss 207 天前 main:|( sleep 10)| dispatchGlobal. print(“updateUI”) global: (sleep 2)| dispatchMain 为啥你要在主线程 sleep 阻塞住它呢? |
6 MacsedProtoss 207 天前 @MacsedProtoss 奇怪…好像空格都被吃掉了,我 format 全都失效了…. |
7 usVexMownCzar 207 天前 via iPhone 看描述,这好像是全部代码,没有 main 函数怎么运行 如果是在 playground 里面,肯定能打印出来。 |
8 yoyoyoyolol 207 天前 你给的代码由于 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 rrubick 206 天前 看着像是在 Playground 里。 建议创建一个项目在 viewController 里去调用 |
10 shixiaoda 206 天前 看到 iOS developer 后继有人,甚是欣慰 |
14 main1234 OP @MacsedProtoss 萌新,我想让主线程不退出 |
15 MacsedProtoss 206 天前 via iPhone @main1234 主线程不退出是 runloop 机制实现的 如果你用纯 swift cli 去跑那肯定不行 |
16 BeiChuanAlex 191 天前 @shixiaoda #10 哈哈哈,笑死了,宗门已经没落成这样了嘛 |