如何避免viewDidLoad中的if代码块每日重复执行?
解决每日仅执行一次
raisedaylimit的方案 咱们先直击问题核心:现在每次App启动都会触发viewDidLoad里的逻辑,导致raisedaylimit可能被重复调用,咱们的目标是让这个方法每天只执行一次,不管App当天启动多少次。
方案一:用NSUserDefaults记录执行日期(其实没你想的复杂)
你提到觉得这个方案实现复杂,但其实它非常直接——只需要记录上一次执行raisedaylimit的日期,每次触发逻辑前先判断今天是不是已经执行过了就行,代码量很小。
具体实现步骤:
- 调用
raisedaylimit后,把当前日期(仅保留年月日部分)存入NSUserDefaults - 每次要判断是否执行时,先取出存储的日期,和今天的日期对比,不同天再执行逻辑
修改后的代码示例:
-(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进入前台时,或者用户打开费用追踪页面时。
具体实现:
- 可以在视图控制器里监听App进入前台的通知,触发检查逻辑
- 也可以在
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
相关产品推荐
相关产品推荐

