我正在构建的项目的应用程序设计/架构问题。
我有一个主控制器,其中包含当前“活动”对象的 NSMutableArray。这些对象中的每一个在实例化时都会有自己的 NSTimer 来计时对象处于“活动”状态的秒数/分钟数/小时数。
当用户创建新对象时,我是否应该在它们自己的单独线程上生成和分配这些 NSTimer?或者我可以在主线程上运行多个这样的计时器吗?
对线程不太熟悉,所以这就是我要问的原因。如果每个对象都分配了自己的 NSTimer,那么就不需要线程了?或者...?
我正在构建的项目的应用程序设计/架构问题。
我有一个主控制器,其中包含当前“活动”对象的 NSMutableArray。这些对象中的每一个在实例化时都会有自己的 NSTimer 来计时对象处于“活动”状态的秒数/分钟数/小时数。
当用户创建新对象时,我是否应该在它们自己的单独线程上生成和分配这些 NSTimer?或者我可以在主线程上运行多个这样的计时器吗?
对线程不太熟悉,所以这就是我要问的原因。如果每个对象都分配了自己的 NSTimer,那么就不需要线程了?或者...?
我认为您不需要 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
如果需要,您可以在主线程上有许多计时器,但根据您的描述,您不需要。NSTimer
s 用于在一段时间后做某事,可选择重复;它们不是用来测量持续时间的。
如果您需要知道您的对象“活动”的时间间隔,只需记录它变为活动的日期 ( [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
}