如何避免执行 viewDidLoad 中的 "if" 块?
How can I avoid this "if" block in viewDidLoad to be executed?
首先抱歉标题不准确,但我会尽可能准确地描述我的问题。
我正在开发一个应用程序来管理 costs/expenses。在这种情况下,我在 viewdidload
方法中有这个 block:
一段关于我目前得到的代码:
-(void)viewDidLoad {
[super viewDidLoad];
if([[self getfrequencyselected] isEqualToString:@"Daily"] && [self limitneedstoberaised]){
NSDateComponents *component = [[NSCalendar currentCalendar] components:NSCalendarUnitWeekday fromDate:[NSDate date]];
switch ([component weekday]) {
case 1:[self raisedaylimit];
break;
case 2: [self raisedaylimit];
break;
--- etc,etc ---
default:
break;
}
}
}
-(BOOL)limitneedstoberaised{
/*
Something like this:
If today's date is the same as the date stored in the SQLite DB (LASTUPDATEDATE column),
then return FALSE, else return TRUE;
[[NSCalendar currentCalendar] isDate:date1 inSameDayAsDate:date2];
*/
}
- 基本上,如果用户之前选择了每天跟踪成本,请输入该切换案例。
- 在 switch 案例中,1、2 等代表一周中的几天,因此它应该在过去的每一天提高指定的成本限制。
我的问题:
这个块在viewdidload
中,所以每次启动应用程序时都会执行它。
我的问题是 [self raisedaylimit]
因此会在用户每次启动应用程序时调用,所以我想避免这种情况,就像逻辑所说的那样,每天只执行一次。
可能的解决方案:
- 我考虑过创建一个 NSUserDefaults object 来跟踪何时调用
raisedaylimit
方法,在 YES 和 NO 之间切换,但这看起来很复杂。
- 我认为也许这个块需要在
viewdidload
方法之外,以便在需要时执行该块
您的第一个想法是正确的,您需要存储上次提高限制的日期在您的应用程序 之外 - 在用户默认设置中是显而易见的地方。
您的代码将读取存储的日期,获取当前日期,并计算它们之间的天数 - 阅读 NSDate
文档,有一些方法可以确定两个日期之间的差异到某种粒度(小时、天等),在进行差异计算之前,您不需要通过自己剥离时间部分来减少 NSDate
值。
在应用启动时调用您的代码。如果您需要允许您的应用程序 运行 超过午夜并且需要第二次(或第三次等)提高限制,您的代码应该计算到午夜的剩余时间并设置一个 NSTimer
来调用自己再次.
如果您在设计解决方案时遇到困难,请用您开发的代码提出一个新问题,您的问题是什么等等,届时肯定会有人帮助您。
首先抱歉标题不准确,但我会尽可能准确地描述我的问题。
我正在开发一个应用程序来管理 costs/expenses。在这种情况下,我在 viewdidload
方法中有这个 block:
一段关于我目前得到的代码:
-(void)viewDidLoad {
[super viewDidLoad];
if([[self getfrequencyselected] isEqualToString:@"Daily"] && [self limitneedstoberaised]){
NSDateComponents *component = [[NSCalendar currentCalendar] components:NSCalendarUnitWeekday fromDate:[NSDate date]];
switch ([component weekday]) {
case 1:[self raisedaylimit];
break;
case 2: [self raisedaylimit];
break;
--- etc,etc ---
default:
break;
}
}
}
-(BOOL)limitneedstoberaised{
/*
Something like this:
If today's date is the same as the date stored in the SQLite DB (LASTUPDATEDATE column),
then return FALSE, else return TRUE;
[[NSCalendar currentCalendar] isDate:date1 inSameDayAsDate:date2];
*/
}
- 基本上,如果用户之前选择了每天跟踪成本,请输入该切换案例。 - 在 switch 案例中,1、2 等代表一周中的几天,因此它应该在过去的每一天提高指定的成本限制。
我的问题:
这个块在viewdidload
中,所以每次启动应用程序时都会执行它。
我的问题是 [self raisedaylimit]
因此会在用户每次启动应用程序时调用,所以我想避免这种情况,就像逻辑所说的那样,每天只执行一次。
可能的解决方案:
- 我考虑过创建一个 NSUserDefaults object 来跟踪何时调用
raisedaylimit
方法,在 YES 和 NO 之间切换,但这看起来很复杂。 - 我认为也许这个块需要在
viewdidload
方法之外,以便在需要时执行该块
您的第一个想法是正确的,您需要存储上次提高限制的日期在您的应用程序 之外 - 在用户默认设置中是显而易见的地方。
您的代码将读取存储的日期,获取当前日期,并计算它们之间的天数 - 阅读 NSDate
文档,有一些方法可以确定两个日期之间的差异到某种粒度(小时、天等),在进行差异计算之前,您不需要通过自己剥离时间部分来减少 NSDate
值。
在应用启动时调用您的代码。如果您需要允许您的应用程序 运行 超过午夜并且需要第二次(或第三次等)提高限制,您的代码应该计算到午夜的剩余时间并设置一个 NSTimer
来调用自己再次.
如果您在设计解决方案时遇到困难,请用您开发的代码提出一个新问题,您的问题是什么等等,届时肯定会有人帮助您。