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)

  • Как узнать, что UIkeyboard появился или нет в iOS?
  • Профили профилей не найдены
  • Изменение текста сделанной кнопки на клавиатуре
  • Получите код ответа HTTP из каждого запроса UIWebView
  • Sharekit: url изменен при публикации на facebook?
  • ios: Как открыть контроллер панели вкладок из ViewController с помощью StoryBoards
  • Проблемы с цветом UIButton
  • Пользовательская кнопка на панели навигации
  • Как отправить электронную почту, уведомление sms с iPhone на устройство Bluetooth LE?
  • Есть ли способ использовать сенсорный идентификатор Apple (сканер отпечатков пальцев) на iOS Simulator?
  • Выровняйте три UILabels рядом друг с другом, и каждая метка может быть многострочной
  • Эффект скручивания карты
  • Interesting Posts

    Управление воспроизведением Webview программно для видео YouTube в iOS

    зачем использовать строковые константы и константы enum?

    Настраиваемая кривая линейная диаграмма, которая может отображать изображение в разных точках

    OpenGL для Mac OS X для разработчика iPhone

    FBFriendPickerViewController показывает и пустую таблицу на iOS. Место Picker работает отлично

    Замените клавиатуру iOS7 на выбор даты в TableViewController

    Нет .xib-файла, когда я создаю новое «Пустое приложение» в XCode

    Xcode не может удалить ячейку с идентификатором

    Добавить индикатор активности в uiwebview

    как получить текущее расстояние между iPhone и парными Apple Watch

    Мне нужен отдельный контроллер просмотра для нового более крупного дисплея iPhone 5?

    Получить конкретное значение макроса препроцессора

    Подпрограммы Google Analytics не отображаются

    Xcode 8: Ошибка PAC Fetch с ошибкой в окне консоли

    Ошибка: не удалось получить устройство ввода по умолчанию … при работе на симуляторе

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