iOS中使用Alamofire异步调用REST API遇阻塞问题求助
iOS Alamofire异步请求阻塞问题排查与解决
问题核心
单个耗时60秒的API请求会阻塞其他所有API请求,直到该请求完成后其他请求才会返回响应,说明请求队列被串行处理,或共享会话的连接资源被耗尽。
解决方案
- 为长耗时请求创建独立Alamofire Session实例
默认的URLSessionConfiguration.default会共享系统HTTP连接池和会话资源,长耗时请求可能占满连接池导致其他请求排队。为这类请求单独创建隔离的Session:
// 初始化独立的长请求Session private let longRequestSession: Session = { let configuration = URLSessionConfiguration.ephemeral configuration.timeoutIntervalForRequest = 300 configuration.timeoutIntervalForResource = 500 configuration.httpMaximumConnectionsPerHost = 5 // 根据业务需求调整并发数 return Session(configuration: configuration, serverTrustManager: .none) }() // 使用独立Session发起长耗时请求 longRequestSession.request("sample_api", method: .post, parameters: parameters) .responseJSON { response in // 异步处理响应结果 }
说明:ephemeral配置不共享缓存、Cookie等资源,与默认Session完全隔离,避免长请求占用公共连接池。
- 禁止在主线程做同步阻塞操作
检查代码中是否存在用信号量、wait()等方式阻塞主线程的逻辑,这类操作会导致主线程卡死,所有后续请求无法执行。例如需避免以下写法:
let semaphore = DispatchSemaphore(value: 0) alamofireManager.request(...).responseJSON { response in semaphore.signal() } semaphore.wait() // 阻塞主线程,导致其他请求停滞
- 调整默认Session的并发连接数
若不想创建独立Session,可修改默认配置的并发连接数,避免单个请求占满资源:
let configuration = URLSessionConfiguration.default configuration.httpMaximumConnectionsPerHost = 10 // 默认值为6,适当提高 configuration.timeoutIntervalForRequest = 300 configuration.timeoutIntervalForResource = 500 let alamofireManager = Session(configuration: configuration)
- 排查服务器端并发处理逻辑
若客户端配置调整后问题仍存在,需确认服务器是否对同一用户的请求做了串行排队限制,联系后端团队排查接口的并发处理机制。
内容的提问来源于stack exchange,提问作者iOS Team Dev
相关产品推荐
相关产品推荐

