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

如何避免viewDidLoad中的if代码块每日重复执行?

解决每日仅执行一次raisedaylimit的方案

咱们先直击问题核心:现在每次App启动都会触发viewDidLoad里的逻辑,导致raisedaylimit可能被重复调用,咱们的目标是让这个方法每天只执行一次,不管App当天启动多少次。

方案一:用NSUserDefaults记录执行日期(其实没你想的复杂)

你提到觉得这个方案实现复杂,但其实它非常直接——只需要记录上一次执行raisedaylimit的日期,每次触发逻辑前先判断今天是不是已经执行过了就行,代码量很小。

具体实现步骤:

  1. 调用raisedaylimit后,把当前日期(仅保留年月日部分)存入NSUserDefaults
  2. 每次要判断是否执行时,先取出存储的日期,和今天的日期对比,不同天再执行逻辑

修改后的代码示例:

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    // 先保留调用,后续可以移到更合适的时机
    [self checkAndRaiseDayLimitIfNeeded];
}

// 封装成独立方法,方便多处调用
-(void)checkAndRaiseDayLimitIfNeeded {
    if([[self getfrequencyselected] isEqualToString:@"Daily"] && [self limitneedstoberaised]){ 
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        NSDate *lastExecutedDate = [defaults objectForKey:@"LastRaiseDayLimitDate"];
        NSDate *today = [NSDate date];
        
        // 只比较年月日,忽略时分秒的差异
        NSCalendar *calendar = [NSCalendar currentCalendar];
        BOOL hasExecutedToday = [calendar isDate:lastExecutedDate inSameDayAsDate:today];
        
        if (!hasExecutedToday) {
            NSDateComponents *component = [calendar components:NSCalendarUnitWeekday fromDate:today]; 
            switch ([component weekday]) { 
                // 多个case执行相同逻辑可以合并,减少冗余
                case 1:
                case 2:
                    [self raisedaylimit]; 
                    break; 
                // 补充其他需要执行的星期几case
                // case 3: [self raisedaylimit]; break;
                default: 
                    break; 
            }
            // 记录今日执行过,下次启动就不会重复触发
            [defaults setObject:today forKey:@"LastRaiseDayLimitDate"];
            [defaults synchronize];
        }
    }
}

方案二:移出viewDidLoad,选择更合适的触发时机

viewDidLoad只在视图控制器初始化时执行一次,但App可能多次切到后台再回到前台,所以更合理的触发时机是App进入前台时,或者用户打开费用追踪页面时。

具体实现:

  1. 可以在视图控制器里监听App进入前台的通知,触发检查逻辑
  2. 也可以在viewWillAppear:里调用checkAndRaiseDayLimitIfNeeded,结合方案一的日期判断,确保每天仅执行一次

示例(用通知监听):

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    // 监听App进入前台的通知,每次回到前台都检查一次
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(checkAndRaiseDayLimitIfNeeded) 
                                                 name:UIApplicationWillEnterForegroundNotification 
                                               object:nil];
}

-(void)dealloc {
    // 记得移除通知监听,避免野指针
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

额外优化小建议

  • 你原来的switch里多个case执行相同代码,可以合并写法,比如case 1: case 2: [self raisedaylimit]; break;,减少重复代码
  • limitneedstoberaised里的日期判断,可以和方案一的日期检查合并,避免重复做日期对比操作

这样调整后,不管App当天启动多少次、前后台切换多少次,raisedaylimit都只会执行一次,完美解决你的问题~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:06:03