0

私が構築しているプロジェクトのアプリケーション設計/アーキテクチャに関する質問。

現在「アクティブな」オブジェクトの NSMutableArray を保持するメインコントローラーがあります。これらのオブジェクトのそれぞれは、インスタンス化されると、オブジェクトが「アクティブ」状態にある秒/分/時間の量を計測する独自の NSTimer を持ちます。

ユーザーが新しいオブジェクトを作成するときに、これらの NSTimer を独自の別のスレッドで生成して割り当てる必要がありますか? または、このような複数のタイマーをメインスレッドで実行できますか?

スレッドに慣れていないので、質問しています。各オブジェクトに独自の NSTimer が割り当てられている場合、スレッド化は必要ありませんか? また...?

4

2 に答える 2

1

これには NSTimer は必要ないと思います。NSTimer は、一定時間後にコールバックを起動するために使用されます。オブジェクトが作成されてからの経過時間を追跡する場合は、次のようにします。

オブジェクトをアクティブにすると:

object.createdAt = [ NSDate date ] ;

オブジェクトがアクティブであった時間を確認するには、次のようにします。

NSTimeInterval numberOfSecondsSinceCreation = [ [ NSDate date ] timeIntervalSinceDate:object.createdAt ] ;

一時停止可能な実装

オブジェクトの「アクティブ時間」を追跡するために使用できるプロジェクトに追加できるカテゴリを作成しました。

@interface NSObject (Timeable)
@property ( nonatomic ) NSTimeInterval totalActiveTime ;
@property ( nonatomic, retain ) NSDate * lastStartTime ;
@end

@implementation NSObject (Timeable)

-(void)startTimer
{
    self.lastStartTime = [ NSDate date ] ;
}

-(void)pauseTimer
{
    self.totalActiveTime = self.totalActiveTime + [[ NSDate date ] timeIntervalSinceDate:self.lastStartTime ] ;
}

-(NSDate*)lastStartTime
{
    return objc_getAssociatedObject( self, @"lastStartTime" ) ;
}

-(void)setLastStartTime:(NSDate*)date
{
    return objc_setAssociatedObject( self, @"lastStartTime", date, OBJC_ASSOCIATION_RETAIN_NONATOMIC ) ;
}

-(NSTimeInterval)totalActiveTime
{
    NSNumber * number = objc_getAssociatedObject( self, @"totalActiveTime" ) ;
    return  number ? [ number doubleValue ] : 0.0 ;
}

-(void)setTotalActiveTime:(NSTimeInterval)time
{
    objc_setAssociatedObject( self, @"totalActiveTime", [ NSNumber numberWithDouble:time ], OBJC_ASSOCIATION_RETAIN_NONATOMIC ) ;
}

@end
于 2012-04-16T19:03:17.000 に答える
0

必要に応じて、メインスレッドに多くのタイマーを設定できますが、説明からすると、その必要はありません。NSTimers は、オプションで繰り返される、一定期間後に何かを行うためのものです。期間を測定するためのものではありません。

オブジェクトが「アクティブ」である時間間隔を知る必要がある場合は、オブジェクトがアクティブになった日付 ( [NSDate date]) を記録し、非アクティブになった日付を記録して、減算 ( [[NSDate date] timeIntervalSinceDate:activationDate];) します。

- (void) beginRockingAndRolling {

    self.lastActivationDate = [NSDate date];

    // Rock and roll!

}

- (void) stopRockingAndRolling {

    self.totalTimeActive += [[NSDate date] timeIntervalSinceDate:self.lastActivationDate];

    // Turn off the rock

}
于 2012-04-16T19:02:43.030 に答える