You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:48:03