Swift中loadBanners函数失败重试逻辑判断问题咨询
解决思路:通过重试计数器追踪失败次数
你之前的问题核心在于用error == true判断首次失败——这完全不符合Swift的类型逻辑,NSError是一个对象实例,根本没法和布尔值比较,而且它本身也无法标识这是第几次失败。正确的做法是给每个nameId维护一个重试次数的状态,通过这个状态来决定是重试还是走最终失败逻辑。
具体实现步骤
添加重试计数变量
在你的类中添加一个字典来记录不同nameId的重试次数(如果只处理单个nameId,用普通整数变量也可以,但字典更通用):// 用字典存储每个banner的重试次数,避免不同banner互相干扰 private var bannerRetryCounts: [String: Int] = [:]修改
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
相关产品推荐
相关产品推荐

