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

