我是否应该在此用例的新线程中启动NSTimer

时间:2012-04-16 18:49:07

标签: objective-c cocoa nstimer nsthread

我正在构建的项目的应用程序设计/架构问题。

我有一个主控制器,它包含当前“活动”对象的NSMutableArray。 这些对象中的每一个在实例化时都将拥有自己的NSTimer,它定时对象处于“活动”状态的秒/分钟/小时数。

当用户创建新对象时,我应该在自己的单独线程上生成和分配这些NSTimers吗?或者我可以在主线程上运行这样的多个计时器吗?

不熟悉线程,所以这就是我要问的原因。如果每个对象都有自己的NSTimer分配,那么不需要线程化?或...?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果需要,您可以在主线程上安装许多计时器,但根据您的描述,您不需要。 NSTimer用于在一段时间后做某事,可选择重复;他们不是为了衡量持续时间。

如果您需要知道对象“活动”的时间间隔,只需记录它变为活动状态的日期([NSDate date]),记录变为非活动状态的日期,然后减去({{1} })。

[[NSDate date] timeIntervalSinceDate:activationDate];