2012-04-16 52 views
0

我正在構建的項目的應用程序設計/體系結構問題。我是否應該在本用例的新線程中啓動NSTimer

我有一個主控制器,它持有一個NSMutableArray當前的「活動」對象。 這些對象中的每一個在實例化時都將擁有自己的NSTimer,該對象處於「活動」狀態的秒數/分鐘/小時數。

當用戶創建新對象時,我應該在它們自己的單獨線程上生成和分配這些NSTimers嗎?或者我可以在主線程上運行多個這樣的定時器嗎?

不太熟悉線程,所以這就是我要問的原因。如果每個對象都有自己的NSTimer分配,那麼線程是不必要的?要麼...?

+0

如果不是絕對必要的話,您不應該創建新線程,因爲它需要大量OS操作。 Apple建議使用Grand Central Dispatch進行多線程處理。雖然在這裏你根本不需要定時器(如下面的人已經回答) – guitarflow 2012-04-16 19:04:18

回答

1

我不認爲你需要NSTimer。 NSTimer用於在一段時間後觸發回調。如果您正試圖從一個對象被創建以跟蹤的時間量,這樣做:

在作出對象主動:

object.createdAt = [ NSDate date ] ; 

要確定長期目標一直活躍,這樣做:

NSTimeInterval numberOfSecondsSinceCreation = [ [ NSDate date ] timeIntervalSinceDate:object.createdAt ] ; 

可暫停執行

我寫了一個類別,你可以添加到你的項目,你可以用它來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是必要的?是的不是? – 2012-04-16 19:09:13

+0

@Skal:反正你不能暫停一個'NSTimer'。每當對象從活動狀態切換到非活動狀態時,只要繼續添加到「時間活動」變量即可。 – 2012-04-16 19:11:14

+0

但是,這不是什麼定時器...我編輯我的回覆 – nielsbot 2012-04-16 19:11:21

0

如果需要,您可以在主線程上擁有多個定時器,但從描述中可以看出,您不需要。 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 

} 
相關問題