【问题标题】:How do you detect clock that changes every minute?您如何检测每分钟都在变化的时钟?
【发布时间】:2012-02-02 03:07:00
【问题描述】:

三个月来我无法完成这项工作。我需要帮助。我被困住了,浪费时间。我很难解释这一点。无论如何,我这里有这段代码。

NSDateFormatter *detailsTimeFormatter = [[NSDateFormatter alloc] init];
[detailsTimeFormatter setTimeStyle:NSDateFormatterShortStyle];
NSLog(@"%@",[[detailsTimeFormatter stringFromDate:[NSDate date]] lowercaseString]);

//if (INSERT CODE HERE) {  ///<-- Detect every Hours and Minutes
//    NSLog(@"True");
//}else{ 
//    NSLog(@"False");
//}

我需要一个可以检测每分钟变化的代码。

我不知道你是怎么做到的。我喜欢举个例子。

    1:00 am     -> NSLog(@"True");
    1:00:10 am --> NSLog(@"False");
    1:00:11 am --> NSLog(@"False");
    1:00:12 am --> NSLog(@"False");
    1:00:## am --> NSLog(@"False");

    1:01 am    --> NSLog(@"True");
    1:01:01 am --> NSLog(@"False");
    1:01:02 am --> NSLog(@"False");
    1:01:03 am --> NSLog(@"False");
    1:01:## am --> NSLog(@"False");
    1:01:59 am --> NSLog(@"False");

    1:02 am    --> NSLog(@"True");
    1:02:01 am --> NSLog(@"False");
    1:02:02 am --> NSLog(@"False");
    1:02:03 am --> NSLog(@"False");
    1:02:## am --> NSLog(@"False");
    1:02:59 am --> NSLog(@"False");
    1:03 am    --> NSLog(@"True");

【问题讨论】:

  • 要么您简单地假设:00 秒为“真”,要么您必须“记住”旧值,以了解新值是否已“跨越”分钟边界。
  • 你如何定义微小的变化?分钟值什么时候变化?

标签: iphone nsdate nstimer


【解决方案1】:

听起来您正在寻找“实时”机制。即使是 NSTimer——即使你可以让定时器在精确的一分钟边界上启动——也不是“实时”的,它们仍然只是近似值。

来自 NSTimer Doco: 定时器不是实时机制;它仅在已添加计时器的运行循环模式之一正在运行并且能够检查计时器的触发时间是否已过时触发。由于典型的运行循环管理的各种输入源,计时器的时间间隔的有效分辨率被限制在 50-100 毫秒的数量级。 如果计时器的触发时间发生在长时间调用期间或运行循环处于不监视计时器的模式下,则计时器不会触发,直到运行循环下次检查计时器。因此,计时器触发的实际时间可能是计划触发时间之后的一个重要时间段。

话虽如此 - 您可以使用这种方法启动一个计时器,它应该在特定时间开始,然后每分钟重新触发一次('大约按照上述')。

- (id)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats – gamozzii 1 min ago edit 

例如:

-(void)mySetupMethod {
    NSDate *startTimeOnMinuteBoundary = ... create a date that starts on minute boundary using a date formatter ...
    NSTimer *myTimer = [[NSTimer alloc] initWithFireDate:startTimeOnMinuteBoundary target:self selector:@selector(myMinuteBoundaryFirer:) userInfo:nil repeats:TRUE;

}

-(void) myMinuteBoundaryFirer:(NSTimer *)theTimer {
     NSLog(@"This should be on a minute boundary, approximately only though because this is not a real time timer");
}

【讨论】:

    【解决方案2】:

    如果您需要具有这种精确结构的东西,我的回答可能对您毫无帮助。否则,如果您只需要每分钟执行一段代码,您可以尝试使用 NSTimer 类,this post 是一个很好的资源描述如何使用它。

    您所要做的就是调用- (id)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats(形成NSTimer 类)并按照您想要的方式启动它。希望这会有所帮助,祝你好运!

    编辑:

    好吧,您不会明确地“检测分钟”,回调会每分钟响应一次,在此回调中,您将让您的代码执行您想做的任何事情。您只需在一分钟内以零秒的时间在某个日期触发您的方法。

    【讨论】:

    • 我已经有了 NSTimer。但是您是否检测到分钟数的变化?
    • 由于 cmets 很长,我将它们删除并将它们放入答案中以提高可读性。
    猜你喜欢
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多