2012-04-16 1 views
0

입니다.이 유스 케이스의 새 스레드에서 NSTimer를 시작해야합니까? 제가 구축중인 프로젝트에 대한 응용 프로그램 설계/아키텍처에 관한 질문은

나는 현재 "활성"인 NSMutableArray를 보유하고있는 메인 컨트롤러가 개 있습니다. 이러한 개체는 인스턴스화 될 때 개체가 "활성"상태 인 시간 (초/분/시간)을 타이밍하는 자체 NSTimer를 갖습니다.

사용자가 새 개체를 만들 때 별도의 스레드에서 이러한 NSTimer를 생성하고 할당해야합니까? 아니면 메인 스레드에서 실행되는 이와 같은 타이머를 여러 개 가질 수 있습니까?

그렇게 스레딩에 익숙하지 않은 이유는 내가 묻는 이유입니다. 각 객체에 NSTimer가 할당되어 있다면 스레딩이 필요하지 않습니까? 또는...?

+0

OS에 많은 작업이 필요하기 때문에 절대적으로 필요하지 않은 새 스레드를 생성해서는 안됩니다. Apple은 Grand Central Dispatch를 멀티 스레딩 용도로 사용할 것을 권장합니다. 여기에서는 실제로 타이머가 전혀 필요하지 않지만 (아래 답변 된 사람들처럼) – guitarflow

답변

1

나는 이것을 위해 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 
+0

사용자가 타이머를 일시 중지 할 수 있어야하므로 NSTimer가 필요하다고 생각합니다. 예 아니오? –

+0

@Skal : NSTimer를 일시 중지 할 수 없습니다. 개체가 활성 상태에서 비활성 상태로 전환 될 때마다 "시간 활성"변수에 계속 추가하십시오. –

+0

하지만 타이머가 필요한 것은 아닙니다 ... 내 응답을 편집했습니다. – nielsbot

0

필요한 경우 주 스레드에 많은 타이머를 가질 수 있지만 설명에서는 필요하지 않습니다. NSTimer은 일정 기간 후에 무언가를하기위한 것이며, 선택적으로 반복됩니다. 그들은 측정 기간이 아닙니다.

개체가 "활성"인 시간 간격을 알고 싶으면 활성화 될 때 ([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 

}