使用Alamofire发送GET请求无响应,Swift命令行项目问题排查
问题原因
- 命令行工具的运行逻辑和常规GUI应用不同:GUI应用会启动主RunLoop持续监听异步事件、用户操作,而命令行工具执行完主线程的所有同步代码后会直接终止进程,不会等待Alamofire的异步网络请求回调执行,因此你只能看到
done的打印,看不到请求返回结果。 - 网络请求是异步执行的,回调任务会被暂存到队列等待执行,还没等到回调触发,进程已经运行结束退出。
修复方案
以下两种方案仅适用于命令行工具场景,请勿在GUI应用中使用:
方案1:使用DispatchSemaphore阻塞主线程等待回调完成
适用于单个或少量异步请求的场景,注意需将回调派发到非主队列,避免主线程死锁:
import Alamofire import Foundation // 初始化信号量,初始计数为0 let semaphore = DispatchSemaphore(value: 0) let request = AF.request("https://httpbin.org/get", method: .get) // 指定回调在全局后台队列执行,避免死锁 request.responseJSON(queue: DispatchQueue.global()) { data in print(data) // 回调执行完成,发送信号 semaphore.signal() } // 阻塞主线程,直到收到信号再继续执行 semaphore.wait() print("done")
方案2:启动主RunLoop持续运行
适用于需要处理多个异步事件的场景,所有任务完成后主动调用exit退出程序即可:
import Alamofire import Foundation let request = AF.request("https://httpbin.org/get", method: .get) request.responseJSON { data in print(data) print("done") // 所有任务处理完成后主动终止进程 exit(EXIT_SUCCESS) } // 启动主RunLoop,持续等待异步事件触发 RunLoop.main.run()
内容的提问来源于stack exchange,提问作者Timo
相关产品推荐
相关产品推荐

