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
相关产品推荐
相关产品推荐

