Слушаете, чтобы перейти на текущую неделю? - PullRequest
0 голосов
/ 10 апреля 2011

Я тестирую несколько вещей для себя в OS X, и я хотел бы знать, как лучше всего это сделать.

У меня есть метод, который возвращает номер текущей недели.

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

  return [components week];
}

Поскольку это будет происходить только раз в неделю, кажется глупым иметь поток, который будет обновлять мой ярлык раз в секунду или около того, но я хочу, чтобы значение ярлыка изменялось с точностью до секунды, когда меняется номер недели.

Я также хочу обновить метку с указанием текущего времени, которое будет фактически раз в секунду или раз в минуту, в зависимости от настроек. Это должен быть поток, который запускается раз в секунду?

1 Ответ

1 голос
/ 10 апреля 2011

Нет необходимости использовать потоки для простых задач, подобных этим.
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.
}
...