2011-04-10 64 views
0

我正在爲我自己在OS X中測試一些東西,並且我想知道做到這一點的最佳方法是什麼。聆聽當前周的變化?

我有一個方法,返回當前的週數。

-(NSInteger) getWeekNumber { 
    NSDate *date = [NSDate date]; 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSDateComponents *components = [calendar components:NSWeekCalendarUnit fromDate:date]; 

    return [components week]; 
} 

因爲這將只有一個星期發生一次,似乎傻有一個線程,會刷新我的標籤每秒一次左右,但我希望標籤值在準確的第二週數的變化而變化。

我也想用當前時間更新一個標籤,實際上每秒一次或每分鐘一次,具體取決於設置。這應該只是一個每秒運行一次的線程?

回答

1

沒有必要使用線程來執行這些簡單的任務。
的NSTimer是去,這樣做每週一次的更新方式:

// Exact moment the new week starts 
NSDate *date = 

// Imagine the new week starts in 5 seconds 
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:5]; 

NSTimer *timer = [[NSTimer alloc] 
        initWithFireDate: date 
        interval: 60*60*24*7 // Equals one week 
        target: self 
        selector: @selector(updateWeekLabel:) 
        userInfo: nil 
        repeats: NO 
        ]; 

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 

下列功能就會被觸發時,新的一週開始:

-(void)updateWeekLabel:(NSTimer*)theTimer 
{ 
    // Get current week and update the label. 
    // Wait for next week or invalidate the timer like this: 
    [theTimer invalidate]; 
} 

使用類似這樣的鐘:

NSTimer *timer = [NSTimer 
        scheduledTimerWithTimeInterval: 1 
        target: self 
        selector: @selector(updateTimeLabel:) 
        userInfo: nil 
        repeats: YES 
        ]; 

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 

觸發該功能每秒:

-(void)updateTimeLabel:(NSTimer*)theTimer 
{ 
    // Get current time and update the label. 
}