2011-05-27 10 views
0

appEnterBackgroundからどのように日付を取得し、appEnterForegroundから取り除き、ラベルの違いを表示しますか? これは私のコードはiphone - 時間(アプリの非表示)と時間(アプリが表示される)の差

**.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]; 
} 

すべてのヘルプは素晴らしいが

+0

エラーとは何ですか? – onnoweb

+0

@onnoweb:** //ここでエラーが発生しました(変数は使用されていません)**私は 'difference'の値をラベルまたは文字列に入れて、計算で使用できるようにしたいと考えています... – myles

+0

[timeIntervalSinceNow help !!](http://stackoverflow.com/questions/6144966/timeintervalsincenow-help) –

答えて

0

私はあなたがここでエラーが発生していないと思うだろう...これまでのところです。あなたは正しく時差を計算しています。そして、あなたは "description"を含む文字列を作成しますが、それを使用しません。

それはすべてのメソッドの終了前にこれを試して正しく動作するかどうかを確認するには、次の

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

あなたが積極的にそれを使用していないので、あなたは、そのtime変数を気にする必要があります。

0

このタイプのイベント(またはイベントの違い)を測定するには、1秒未満の解像度が必要です。マシン時間を取得するための "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を押して停止します。 stopを呼び出した後も、いつでも時刻を読むことができます(seconds)。

機能で

例(実行のタイミング呼び出し)

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

    ... do stuff 

    [stopWatch StopWithContext:[NSString stringWithFormat:@"Created %d Records",[records count]]]; 
} 
関連する問題