【问题标题】:Time between two actions两个动作之间的时间
【发布时间】:2013-12-31 21:19:31
【问题描述】:

试图记录用户按下一个按钮,然后再按下一个按钮所花费的时间。

这是我的 .m 文件的一部分...我无法让 theDate 保存它的变量(开始时间)所有发生的事情是我在日志和文本标签中得到 0.000 秒。

- (IBAction)start:(id)sender
{

    NSDate *theDate = [[NSDate date] init];

}

- (IBAction)stop:(id)sender
{
    NSTimeInterval timeInterval = [theDate timeIntervalSinceNow];
    NSString *time = [NSString stringWithFormat:@"%f", timeInterval];

    _timeLabel.text = time;
    NSLog(time);
}

我也有

@property(retain, nonatomic) NSDate *theDate;

在头文件中和

@synthesize theDate;

在 .m 文件的顶部。

谢谢!

顺便说一句,我正在尝试关闭这篇文章:Getting the time elapsed (Objective-c)

【问题讨论】:

    标签: objective-c


    【解决方案1】:
    NSDate *theDate = [[NSDate date] init];
    

    创建一个局部变量,使其不使用您的属性。此外,正如@Catfish_Man 所指出的,[[NSDate date] init] 应该只是[NSDate date]

    此外,您应该使用self.theDate 来使用该属性。

    - (IBAction)start:(id)sender
    {
        self.theDate = [NSDate date];
    }
    
    - (IBAction)stop:(id)sender
    {
        NSTimeInterval timeInterval = [self.theDate timeIntervalSinceNow];
        NSString *time = [NSString stringWithFormat:@"%f", timeInterval];
    
        _timeLabel.text = time;
        NSLog(time);
    }
    

    【讨论】:

      【解决方案2】:

      您正在用本地范围重新定义日期

      - (IBAction)start:(id)sender
      

      你应该使用

      self.date = [NSDate date];
      

      【讨论】:

      • 不,应该是self.date = [NSDate date];
      • 已修复,只是试图回答原始问题并从他的代码中复制粘贴
      【解决方案3】:

      您可以使用此 StopWatch 类获得真正精确的计时(seconds.parts of seconds)。它使用 iPhone 中的高精度计时器。使用 NSDate 只会让您获得秒级的准确性。

      StopWatch.h

      #import <Foundation/Foundation.h>
      
      
      @interface StopWatch : NSObject 
      {
          uint64_t _start;
          uint64_t _stop;
          uint64_t _elapsed;
      }
      
      -(void) Start;
      -(void) Stop;
      -(void) StopWithContext:(NSString*) context;
      -(double) seconds;
      -(NSString*) description;
      +(StopWatch*) stopWatch;
      -(StopWatch*) init;
      @end
      

      StopWatch.m

      #import "StopWatch.h"
      #include <mach/mach_time.h>
      
      @implementation StopWatch
      
      -(void) Start
      {
          _stop = 0;
          _elapsed = 0;
          _start = mach_absolute_time();
      }
      -(void) Stop
      {
          _stop = mach_absolute_time();   
          if(_stop > _start)
          {
              _elapsed = _stop - _start;
          }
          else 
          {
              _elapsed = 0;
          }
          _start = mach_absolute_time();
      }
      
      -(void) StopWithContext:(NSString*) context
      {
          _stop = mach_absolute_time();   
          if(_stop > _start)
          {
              _elapsed = _stop - _start;
          }
          else 
          {
              _elapsed = 0;
          }
          NSLog([NSString stringWithFormat:@"[%@] Stopped at %f",context,[self seconds]]);
      
          _start = mach_absolute_time();
      }
      
      
      -(double) seconds
      {
          if(_elapsed > 0)
          {
              uint64_t elapsedTimeNano = 0;
      
              mach_timebase_info_data_t timeBaseInfo;
              mach_timebase_info(&timeBaseInfo);
              elapsedTimeNano = _elapsed * timeBaseInfo.numer / timeBaseInfo.denom;
              double elapsedSeconds = elapsedTimeNano * 1.0E-9;
              return elapsedSeconds;
          }
          return 0.0;
      }
      -(NSString*) description
      {
          return [NSString stringWithFormat:@"%f secs.",[self seconds]];
      }
      +(StopWatch*) stopWatch
      {
          StopWatch* obj = [[[StopWatch alloc] init] autorelease];
          return obj;
      }
      -(StopWatch*) init
      {
          [super   init];
          return self;
      }
      
      @end
      

      该类有一个静态stopWatch 方法,该方法返回一个自动释放的对象。

      调用start 后,使用seconds 方法获取经过的时间。再次调用start 重新启动它。或stop 停止它。拨打stop后,您仍然可以随时读取时间(拨打seconds)。

      函数中的示例(执行时间调用)

      -(void)SomeFunc
      {
         StopWatch* stopWatch = [StopWatch stopWatch];
         [stopWatch Start];
      
         ... do stuff
      
         [stopWatch StopWithContext:[NSString stringWithFormat:@"Created %d Records",[records count]]];
      }
      

      如果您需要,C++ 中有一个等效版本(用于 .mm 或 .cpp 实现)。你可以找到here

      即使您不专门使用该类,通用技术也可以让您获得高精度的事件时间差。

      注意如果是第一次,我可以缓存 mach_timebase_info_data_t 并保存调用以获取它。这是较旧的代码,没有那种(次要)优化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-12
        • 2016-11-20
        • 2013-10-08
        • 2012-02-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多