我正在构建的项目的应用程序设计/架构问题。
我有一个主控制器,它包含当前“活动”对象的NSMutableArray。 这些对象中的每一个在实例化时都将拥有自己的NSTimer,它定时对象处于“活动”状态的秒/分钟/小时数。
当用户创建新对象时,我应该在自己的单独线程上生成和分配这些NSTimers吗?或者我可以在主线程上运行这样的多个计时器吗?
不熟悉线程,所以这就是我要问的原因。如果每个对象都有自己的NSTimer分配,那么不需要线程化?或...?
答案 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];