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

SwiftSpinner在iOS Swift项目调用API时显示异常求助

解决SwiftSpinner在快速API请求后无法隐藏的问题

我明白你遇到的麻烦了——当API请求完成得太快时,SwiftSpinner还没完成初始化就被调用了hide,结果它后来显示出来就再也关不掉了对吧?这是因为SwiftSpinner的show()方法是异步创建UI元素的,而你的请求回调里的hide()可能在Spinner真正显示之前就执行了,导致这个hide操作根本没起作用。

给你一个可靠的解决方案,我们可以用请求计数器来处理这个问题,同时确保所有UI操作都在主线程执行:

// 在你的网络工具类里添加一个私有计数器
private static var activeRequestCount = 0

static func request(target: ServerAPI, success successCallback: @escaping (Response) -> Void, error errorCallback: @escaping (Swift.Error) -> Void, failure failureCallback: @escaping (MoyaError) -> Void) {
    DispatchQueue.main.async {
        activeRequestCount += 1
        // 只有当第一个请求发起时才显示Spinner
        if activeRequestCount == 1 {
            SwiftSpinner.show()
        }
        print("Start: \(target.path)")
    }
    
    provider.request(target) { (result) in
        DispatchQueue.main.async {
            activeRequestCount -= 1
            // 只有当最后一个请求完成时才隐藏Spinner
            if activeRequestCount == 0 {
                SwiftSpinner.hide()
            }
        }
        
        switch result {
        case .success(let response):
            successCallback(response)
            // 这里处理你的成功逻辑
        case .failure(let error):
            if let moyaError = error as? MoyaError {
                failureCallback(moyaError)
            } else {
                errorCallback(error)
            }
            // 这里处理你的失败逻辑
        }
    }
}

为什么这个方案有效?

  • 计数器跟踪请求状态:通过activeRequestCount记录当前活跃的请求数,只有第一个请求启动时才显示Spinner,最后一个请求结束时才隐藏它。这样即使单个请求完成得极快,只要计数器逻辑正确,hide操作会在Spinner已经初始化完成后执行。
  • 主线程执行UI操作:把Spinner的显示/隐藏操作都包在DispatchQueue.main.async里,确保UI操作都在主线程执行,避免线程问题。
  • 支持并发请求:如果你的APP同时发起多个API请求,这个方案也能保证Spinner在所有请求都完成后才隐藏,不会出现提前消失的情况。

另外,也可以考虑给SwiftSpinner添加一个小小的延迟显示(比如SwiftSpinner.show(delay: 0.1)),但这种方法不够可靠——如果请求比延迟时间还快,问题还是会出现。计数器的方法是最稳妥的。

内容的提问来源于stack exchange,提问作者Thiều Quang Cường

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:23:58