【问题标题】:How can I avoid this "if" block in viewDidLoad to be executed?如何避免执行 viewDidLoad 中的这个“if”块?
【发布时间】:2018-05-20 00:15:18
【问题描述】:

首先抱歉标题不准确,但我会尽量准确地描述我的问题。

我正在开发一个应用来管理成本/费用。在这种情况下,我在 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 对象来跟踪调用 raisedaylimit 方法时,在 YES 和 NO 之间切换,但这似乎很复杂。
  • 我认为也许这个块需要在viewdidload 方法之外,以便在需要时执行该块

【问题讨论】:

  • "这个块在viewdidload中,所以每次app启动都会执行"当然。这就是viewDidLoad 的意思。实际上,它的意思是,每次这个视图控制器出现并获得它的视图。如果那不是您想要运行代码的时候,那么这是一个放置它的愚蠢的地方。 — “也许这个块需要在 viewdidload 方法之外,以便在需要的时候执行该块” 好的,那么什么时候需要呢?如果您能告诉我们,我们可以建议将代码放置在何处以便它运行。
  • 嗨,马特 :)。谢谢回复。所以我会告诉你,基本上当用户启动应用程序时,该块会检查是否选择了每日、每周或每月频率。基于此,交换机将确定在哪一天需要提高限制。当限制已经提高时,将不会执行此块。我不确定现在是否更有意义:)

标签: ios objective-c viewdidload


【解决方案1】:

您的第一个想法是正确的,您需要将上次提高限制的日期存储在您的应用外部 - 并且在用户默认值中是显而易见的地方。

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

在应用启动时调用您的代码。如果您需要允许您的应用程序在午夜之后运行并且需要在第二次(或第三次等)时间提高限制,您的代码应该计算到午夜的时间并设置NSTimer 以再次调用自身。

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

【讨论】:

  • 谢谢你的回答:)。我发现了一些东西。 NSCalendar 有一个名为 -(BOOL)isDate:(NSDate *)date1 inSameDayAsDate:(NSDate *)date2 NS_AVAILABLE(10_9, 8_0) 的方法,它返回 TRUE 是两个日期在同一天。我的代码可以是这样的:如果今天和存储的最后更新日期在同一天,则什么也不做,否则 [self raisedaylimit];我每天只需要提高一次限额。你觉得这行得通吗?还是我错过了什么?
  • “你认为这行得通吗?” - 问自己一些问题,例如:您需要每个日历日提高一次限制,还是每天运行您的应用程序一次?如果您的应用程序在午夜执行,您是否需要提高限制?这里没有人可以为您回答这些问题。一旦你有你的答案设计和算法来处理它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
相关资源
最近更新 更多