iphone - разница между временем (приложение скрывается) и временем (приложение появляется) - PullRequest
0 голосов
/ 27 мая 2011

как мне получить дату из appEnterBackground и убрать из appEnterForeground, а затем показать разницу в метке. Это мой код до сих пор ..

**.h**
    NSTimeInterval appEnteredBackground;
    NSTimeInterval appEnteredForeground;
    NSTimeInterval difference;  

**.m**

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    appEnteredBackground = [NSDate timeIntervalSinceReferenceDate];
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    appEnteredForeground = [NSDate timeIntervalSinceReferenceDate];
    difference = appEnteredForeground - appEnteredBackground;

    NSLog(@"Duration is %@",[NSDate dateWithTimeIntervalSinceReferenceDate: difference]);
    NSLog(@"Duration is %@", [NSString stringWithFormat:@"%f", difference]);

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];

    NSString *time = [NSString stringWithFormat:@"%f", difference];   **//ERROR HERE (variable not used)**

    [dateFormatter release];
}

Любая помощь будет фантастической

Ответы [ 2 ]

0 голосов
/ 02 января 2014

Чтобы измерить событие этого типа (или разницу событий), вам нужно что-то с разрешением менее секунды.Существует интерфейс «c» для получения машинного времени, который представляет собой аппаратные «тики» внутри процессора.

Вы можете получить действительно точную синхронизацию (миллисекунды, микросекунды, если вы им верите), используя этот класс StopWatch.

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.

Пример функции A (синхронизация вызова выполнения)

-(void)SomeFunc
{
   StopWatch* stopWatch = [StopWatch stopWatch];
   [stopWatch Start];

   ... do stuff

   [stopWatch StopWithContext:[NSString stringWithFormat:@"Created %d Records",[records count]]];
}
0 голосов
/ 27 мая 2011

Я думаю, что у вас нет ошибок здесь.Вы правильно вычисляете разницу во времени, затем строите строку с ее «описанием», но не используете ее.

Чтобы увидеть, все ли работает правильно, попробуйте это до конца метода:

NSLog(@"Computed time was: %@", time);

Вам следует позаботиться об этой переменной time, поскольку вы не используете ее активно.

...