两次行动之间的时间

时间:2013-12-31 21:19:31

标签: objective-c

尝试记录用户按下一个按钮然后按下一个按钮所需的时间。

这是我的.m文件的一部分...我无法让日期保持其变量(开始时间)所有发生的事情是我在日志中获得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)

3 个答案:

答案 0 :(得分:2)

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);
}

答案 1 :(得分:1)

您正在使用

中的本地范围重新定义日期
- (IBAction)start:(id)sender

您应该使用

self.date = [NSDate date];

答案 2 :(得分:1)

使用此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阻止它。您仍然可以在致电seconds后随时阅读时间(致电stop)。

功能中的示例(执行的定时调用)

-(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并保存调用以获取它。这是旧代码,没有(次要)优化。