Как отобразить время в секундах в Какао эффективно?

Итак, класс класса обычно равен type, и когда вы вызываете Class(), метод __call__() класса Class обрабатывает это. Я считаю, что type.__call__() реализован более или менее так:

def __call__(cls, *args, **kwargs):
    # should do the same thing as type.__call__
    obj = cls.__new__(cls, *args, **kwargs)
    if isinstance(obj, cls):
        obj.__init__(*args, **kwargs)
    return obj

Прямой ответ на ваш вопрос - нет, то, что __init__() может сделать (изменить / «инициализировать» указанный экземпляр), подмножество вещей, которые __new__() может сделать (создать или иным образом выбрать любой объект, который он хочет, сделать что-нибудь с этим объектом, который он хочет, прежде чем объект будет возвращен).

Однако удобно использовать оба метода. Использовать __init__() проще (не нужно ничего создавать, ничего не возвращать), и я считаю, что лучше всегда использовать __init__(), если у вас нет особой причины использовать __new__().

6
задан rscott 5 November 2009 в 01:46
поделиться

4 ответа

Вы показываете его с разрешением до десятых долей секунды (или выше)?

Если да, то я не вижу проблем. Обычно опрос - отстой, потому что то, что вы проверяете, могло не измениться, но время не останавливается на вас. Так что таймер десятых долей секунды вполне подойдет.

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

Обратите внимание, что хотя время всегда движется, оно не всегда движется линейно: оно может перемещаться вперед или назад на час или полчаса , или любое количество, если пользователь (или ntpd) изменяет настройку системных часов. В Mac OS X 10.6 и более поздних версиях вы можете наблюдать за NSSystemClockDidChangeNotification и повторно настраивать дату срабатывания таймера, когда это произойдет.

или любое количество, если пользователь (или ntpd) изменяет настройку системных часов. В Mac OS X 10.6 и более поздних версиях вы можете наблюдать за NSSystemClockDidChangeNotification и повторно настраивать дату срабатывания таймера, когда это произойдет.

или любое количество, если пользователь (или ntpd) изменяет настройку системных часов. В Mac OS X 10.6 и более поздних версиях вы можете наблюдать за NSSystemClockDidChangeNotification и повторно настраивать дату срабатывания таймера, когда это произойдет.

6
ответ дан 17 December 2019 в 02:30
поделиться

Как насчет того, чтобы использовать NSTimer, который запускается каждую секунду, а затем вы проверяете время срабатывания и убедитесь, что оно точно в начале секунды. Вы можете использовать initWithFireDate: interval: target: selector: userInfo: repeat: или установить время следующего вызова соответствующим образом, используя setFireDate: после создания таймера:

NSTimeInterval interval = [[timer fireDate] timeIntervalSinceReferenceDate];
NSTimeInterval nextFire = ceil(interval);
[timer setFireDate: [NSDate dateWithTimeIntervalSinceReferenceDate: nextFire];

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

2
ответ дан 17 December 2019 в 02:30
поделиться

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

0
ответ дан 17 December 2019 в 02:30
поделиться

Как насчет использования gettimeofday (2) ? Он возвращает много точной информации о времени для использования.

-2
ответ дан 17 December 2019 в 02:30
поделиться