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 回答