Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我怎样才能避免这种情况;如果;要执行viewDidLoad中的块?_Ios_Objective C_Viewdidload - Fatal编程技术网

Ios 我怎样才能避免这种情况;如果;要执行viewDidLoad中的块?

Ios 我怎样才能避免这种情况;如果;要执行viewDidLoad中的块?,ios,objective-c,viewdidload,Ios,Objective C,Viewdidload,首先,很抱歉标题不准确,但我会尽可能准确地描述我的问题 我正在开发一个应用程序来管理成本/费用。在这种情况下,我在viewdidload方法中使用了这个块: 关于我到目前为止得到的信息的一段代码: -(void)viewDidLoad { [super viewDidLoad]; if([[self getfrequencyselected] isEqualToString:@"Daily"] && [self limitneedstoberaised]){ NSDate

首先,很抱歉标题不准确,但我会尽可能准确地描述我的问题

我正在开发一个应用程序来管理成本/费用。在这种情况下,我在
viewdidload
方法中使用了这个

关于我到目前为止得到的信息的一段代码:

-(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];


  */

 }
-基本上,如果用户以前选择每天跟踪成本,则在该切换案例中输入。 -在切换情况下,1、2等代表一周中的几天,因此它应该在每过一天提高指定的成本限制

我的问题:

此块位于
viewdidload
中,因此每次启动应用程序时都会执行此块

我的问题是,
[self-raisedaylimit]
将因此在用户每次启动应用程序时被调用,因此我希望避免这种情况,就像逻辑所说的那样,每天只执行一次

可能的解决方案:

  • 我曾考虑过创建一个NSUserDefaults对象,以便在调用
    raisedaylimit
    方法时跟踪,在YES和NO之间切换,但这似乎很复杂
  • 我认为这个块可能需要在
    viewdidload
    方法之外,以便在需要时执行该块

您的第一个想法是正确的,您需要在应用程序之外存储上次提高限制的日期,而用户默认值是最明显的地方

您的代码将读取存储的日期,获取当前日期,并计算它们之间的天数–阅读
NSDate
文档,有一些方法可以确定两个日期之间在某种粒度(小时、天等)上的差异,在进行差异计算之前,您无需通过自己去除时间分量来减少
NSDate

在应用程序启动时调用您的代码。如果您需要允许应用程序运行超过午夜,并且需要将限制提高一秒(或第三秒等),则代码应计算到午夜的剩余时间,并设置一个
NSTimer
以再次调用自身


如果您在设计解决方案时遇到困难,请使用您开发的代码问一个新问题,您的问题是什么,等等。毫无疑问,在这一点上,有人会帮助您。

“此块位于viewdidload中,因此每次启动应用程序时都会执行它”。这就是
viewDidLoad
的意思。实际上,它的意思是,每次这个视图控制器出现并获得它的视图时。如果那不是你想运行代码的时候,那么这是一个愚蠢的地方“也许这个块需要在viewdidload方法之外,以便在需要时执行该块”好的,那么什么时候需要它?如果您可以告诉我们,我们可以建议将代码放置在何处以便运行。嗨,matt:)。谢谢你的回复。所以我会告诉你,基本上当用户启动应用程序时,程序块会检查是否选择了每日、每周或每月的频率。基于此,开关将确定在哪一天需要提高限值。当限制已经提高时,将不执行此块。我不确定它现在是否更有意义:)谢谢你的回答:)。我发现了一些东西
NSCalendar
有一个名为
-(BOOL)isDate:(NSDate*)date1 inSameDayAsDate:(NSDate*)date2 NS\u AVAILABLE(10\u 9,8\u 0)
的方法,如果两个日期在同一天,则返回TRUE。我的代码可以是这样的:如果今天和存储的最后更新的日期在同一天,什么也不做,否则[self-raisedaylimit];我每天只需要提高限额一次。你认为这样行吗?或者我遗漏了什么吗?“你认为这行得通吗?”-问问自己这样的问题:你需要在每个日历日或你的应用程序运行时每天提高一次限制吗?如果你的应用程序在午夜执行,你需要提高限制吗?这里没有人能为你回答这些问题。一旦你有了答案,就要设计出处理它们的算法。