나는 이것을 위해 NSTimer가 필요하다고 생각하지 않습니다. NSTimer는 일정 시간 후에 콜백을 시작하는 데 사용됩니다. 활성 객체 만들기시
: 객체가 생성 된 이후 시간의 양을 추적하려는 경우,이 작업을 수행
object.createdAt = [ NSDate date ] ;
개체가 활성화되었습니다 시간을 결정하기를,이 작업을 수행 :
를
NSTimeInterval numberOfSecondsSinceCreation = [ [ NSDate date ] timeIntervalSinceDate:object.createdAt ] ;
pausable 구현
나는 당신이 TRAC에 사용할 수있는 프로젝트에 추가 할 수있는 범주를 썼다 k '객체에 대한 활성 시간'.
@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
OS에 많은 작업이 필요하기 때문에 절대적으로 필요하지 않은 새 스레드를 생성해서는 안됩니다. Apple은 Grand Central Dispatch를 멀티 스레딩 용도로 사용할 것을 권장합니다. 여기에서는 실제로 타이머가 전혀 필요하지 않지만 (아래 답변 된 사람들처럼) – guitarflow