UILabel с текущим временем

У меня есть UILabel, что я хочу показать текущее время (HH: mm) (в то же время, что и в строке состояния).

Как обновить ярлык, чтобы перейти к новому времени? Если я планирую NSTimer с интервалом в 60 секунд, тогда метка может быть вне времени на минуту, если таймер срабатывает как раз перед тем, как изменяется время в системе.

Было бы нормально установить интервал таймера на 1 секунду или будет использовать больше ресурсов, чем необходимо? Или есть другой способ удостовериться, что ярлык будет синхронизироваться со стандартными часами (предпочтительно, точно, но 1-уй лиевый способ в порядке)?

7 Solutions collect form web for “UILabel с текущим временем”

Отправка – ваш друг:

void runBlockEveryMinute(dispatch_block_t block) { block(); // initial block call // get the current time struct timespec startPopTime; gettimeofday((struct timeval *) &startPopTime, NULL); // trim the time startPopTime.tv_sec -= (startPopTime.tv_sec % 60); startPopTime.tv_sec += 60; dispatch_time_t time = dispatch_walltime(&startPopTime, 0); __block dispatch_block_t afterBlock = ^(void) { block(); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * 60), dispatch_get_main_queue(), afterBlock); }; dispatch_after(time, dispatch_get_main_queue(), afterBlock); // start the 'timer' going } 

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

Было бы нормально установить интервал таймера на 1 секунду или будет использовать больше ресурсов, чем необходимо?

Зависит от того, что вы делаете. Если вы вычисляете первые миллионы цифр pi или рендерите несколько сотен трехмерных объектов, вам понадобится каждый процессорный цикл, который вы можете сэкономить. Если процессор работает на холостом ходу большую часть времени, вы также можете использовать эти циклы, чтобы ваш интерфейс выглядел красиво.

 //Create a timer... timer = [NSTimer scheduledTimerWithTimeInterval:0.25 target:self selector:@selector(tick:) userInfo:NULL repeats:YES]; //Function to update time - (void)tick:(NSTimer*)t { NSDate *now = [NSDate date]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"HH:mm:ss"]; NSString *timeString = [dateFormatter stringFromDate:now]; [uilabel setText:timeString]; } 

ваш таймер будет всегда «задерживаться» на некоторое время, так как для выполнения такой функции нет функций «делегата».

Я бы придерживался таймера, но отправка, как упоминал Ричард Дж. Росс III, также действительна.

Я думаю, что я запустил NSTimer с 1-секундной задержкой в ​​фоновом потоке, попробуйте запустить текущий метод (HH: mm) на текущее время, отображаемое на этикетке. Если он совпадает с его выбросом, если он новый, обновите ярлык.

Если вы беспокоитесь о производительности, после того, как вы вернетесь в первый раз, узнайте, сколько секунд осталось от следующей минуты, и пусть это запустит таймер так долго. Затем после первого обновления таймер запускается с интервалом в 60 секунд.

одна секунда – правильный ответ.

Возможно, вы можете установить два таймера. Первый (один раз) используется для синхронизации второго таймера с интервалом 60 с, который запускает его, когда системное время приходит к ЧЧ: 00;

Синхронизированные обновления второй точности без gettimeofday или блоков. Слабый указатель и dispatch_async предотвращают сохранение цикла.

 - (void)updateTimeLabel { if (!timeFormatter) { timeFormatter = [NSDateFormatter new]; timeFormatter.dateStyle = NSDateFormatterNoStyle; timeFormatter.timeStyle = NSDateFormatterShortStyle; } NSDate *currentTime = [NSDate date]; NSTimeInterval delay = [[currentTime nextMinute] timeIntervalSinceDate:currentTime]; timeLabel.text = [timeFormatter stringFromDate:currentTime]; __weak id weakSelf = self; dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf performSelector:@selector(updateTimeLabel) withObject:nil afterDelay:delay]; }); } 

Получите следующую минуту с 0 секундами.

 @implementation NSDate (Utils) - (NSDate *)nextMinute { NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *comps = [calendar components:(NSCalendarUnit) NSUIntegerMax fromDate:self]; comps.minute += 1; comps.second = 0; return [calendar dateFromComponents:comps]; } @end 

Я думаю, что есть цикл сохранения с блоком в ответе Ричарда (он может быть исправлен с помощью __weak + dispatch_async)

  • Как удалить ключ из nsmutabledictionary Когда значение этого ключа пуста или null в ios?
  • NSPredicate для диапазона между двумя датами работает не так, как ожидалось
  • Получите высоту клавиатуры iOS без отображения клавиатуры
  • UIScrollView с эффектом fadeIn / fadeOut
  • NSDictionary - как вернуть ключ как строку
  • Временная метка как водяной знак на видео iOS
  • Как добавить выбор даты в листе действий?
  • Переход от платного приложения к бесплатному приложению с подпиской на автоматическое продление подписки
  • Обнаруживать, когда нажата кнопка home iOS
  • MKAnnotation: название в iOS 5.0
  • iOS: как вызвать силовую атаку пользователя на iPhone?
  • Interesting Posts

    Как «перепроверить» разрешение электронной почты с помощью Facebook iOS SDK 4.x?

    Crash in openURL: Возможная ошибка SDK для Facebook в iOS 9

    Основные данные: вставка объектов, разбитых в глобальной очереди

    Universal Link не работает в Safari

    Вход Google не перенаправляется на приложение после разрешения

    SUBQUERY в NSPredicate и NSInvalidArgumentException

    iOS Advanced Audio API для распаковки формата

    Проверка, если `if let` равен нулю

    Ошибки компоновщика, создающие приложение iOS с Simperium

    Как создать предикат для подсчета объектов несколько взаимосвязей? Основные данные iOS Swift

    Ленивая загрузка UITableView с несколькими изображениями в каждой ячейке

    Как преобразовать координаты события касания в подпункт к координатам в его родительском представлении?

    NSFetchedResultsController всегда не возвращает строк

    UITextVIew secureTextEntry не работает

    Невозможно скомпилировать Cocoapods с XCode / Obj-C – «Pods-prefix.pch.dia: нет такого файла или каталога»

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.