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

Swift中loadBanners函数失败重试逻辑判断问题咨询

解决思路:通过重试计数器追踪失败次数

你之前的问题核心在于用error == true判断首次失败——这完全不符合Swift的类型逻辑,NSError是一个对象实例,根本没法和布尔值比较,而且它本身也无法标识这是第几次失败。正确的做法是给每个nameId维护一个重试次数的状态,通过这个状态来决定是重试还是走最终失败逻辑。

具体实现步骤

  1. 添加重试计数变量
    在你的类中添加一个字典来记录不同nameId的重试次数(如果只处理单个nameId,用普通整数变量也可以,但字典更通用):

    // 用字典存储每个banner的重试次数,避免不同banner互相干扰
    private var bannerRetryCounts: [String: Int] = [:]
    
  2. 修改loadBanners函数逻辑
    在调用getBanners时,先获取当前nameId的重试次数,然后在失败回调中根据这个次数决定行为:

    func loadBanners(nameId: String, onSuccess: @escaping (_ objectArray: [IGCBanners]) -> (), onFailure: @escaping (NSError) -> ()) {
        // 获取当前banner的重试次数,默认0(首次调用)
        let currentRetryCount = bannerRetryCounts[nameId] ?? 0
        
        IGCTransactionManager.sharedInstance.getBanners(
            nameId: nameId,
            onSuccess: { json in
                // 成功后重置该banner的重试次数,确保下次加载是全新状态
                self.bannerRetryCounts[nameId] = 0
                
                if let json = json {
                    let res: IGCBannersRootClass = IGCBannersRootClass(fromJson: json)
                    
                    self.populate(res)
                    
                    if nameId == "home" {
                        self.populateSlideShow(res)
                    }
                    
                    onSuccess(TransactionSession.shared.Array)
                } else {
                    onFailure(IGCTransactionManager.sharedInstance.getErrorForNil())
                }
            },
            onFailure: { error in
                if currentRetryCount < 1 {
                    // 首次失败:还没重试过,增加计数后重新调用
                    self.bannerRetryCounts[nameId] = currentRetryCount + 1
                    self.loadBanners(nameId: nameId, onSuccess: onSuccess, onFailure: onFailure)
                } else {
                    // 第二次失败:重置计数,展示无效场景
                    self.bannerRetryCounts[nameId] = 0
                    
                    if !self.showInvalidResponse(onSuccess: onSuccess, onFailure: onFailure) {
                        onFailure(error)
                    }
                }
            }
        )
    }
    

关键细节说明

  • 分banner计数:用字典bannerRetryCounts可以确保不同nameId的banner加载重试次数互不干扰,比如加载"home"和"detail"的banner时,各自的重试逻辑独立。
  • 成功后重置计数:每次成功加载后把对应nameId的计数归零,避免下次调用时继承之前的重试状态。
  • 灵活调整重试次数:这里设定最多重试1次(首次失败重试,第二次失败走最终逻辑),如果需要调整重试次数,只需要把currentRetryCount < 1改成currentRetryCount < N(N是你想要的重试次数)。

内容的提问来源于stack exchange,提问作者georgekak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 16:45:29