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

如何让Alamofire API调用函数首次触发后每小时执行一次?

问题解决:实现API首次立即调用+每小时重复执行

问题分析

你的代码核心问题是:定时器设置了首次执行延迟1小时(.now() + .seconds(3600)),且没有在函数触发时立即调用API,导致第一次API请求要等1小时才执行,不符合需求。

修改方案

我们可以把API调用逻辑抽成独立函数,先手动执行一次(满足首次立即调用),再通过定时器设置每小时重复执行:

步骤1:抽离API调用逻辑

先把原定时器事件里的API请求代码单独封装成一个函数,避免重复代码,同时优化强制解包问题:

private func fetchAdds() {
    addsViewModel.getAddsImage { [weak self] response, fileType in
        guard let self = self else { return }
        
        if response == 200 {
            self.addsViewModel.filterPromotion()
            // 用可选绑定替代强制解包,避免崩溃
            if let coverFileName = self.addsViewModel.filteredPromotion?.coverFileName {
                self.setupAdds(typeFile: fileType, data: coverFileName)
            }
        } else {
            // 简化原有的判断逻辑,合并重复的dismiss操作
            let shouldDismiss = self.addsViewModel.dataPromotion.first?.visible == false 
                && self.addsViewModel.dataPromotion.first?.active == false 
                || self.addsViewModel.bannerAdds?.isEmpty == true
            
            if shouldDismiss {
                self.dismiss(animated: false)
            }
        }
    }
}

步骤2:修改getAdds()函数

在函数触发时立即执行一次API请求,再设置定时器每小时重复调用:

func getAdds() {
    // 1. 首次触发时立即执行API调用
    fetchAdds()
    
    // 2. 设置定时器,首次执行延迟1小时,之后每小时重复
    addsViewModel.timer.setEventHandler { [weak self] in
        self?.fetchAdds()
    }
    addsViewModel.timer.schedule(deadline: .now() + .seconds(3600), repeating: .seconds(3600), leeway: .seconds(60))
    addsViewModel.timer.activate()
}

关键说明

  • 抽离fetchAdds()函数:让API调用逻辑复用,同时通过[weak self]和guard let self = self避免循环引用和强制解包崩溃。
  • 手动执行fetchAdds():满足首次触发函数就立即获取数据的需求。
  • 定时器设置保持deadline: .now() + .seconds(3600):确保第一次定时执行是在首次调用后的1小时,之后每小时重复。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:05:14