NSTimer, не стреляя, когда runloop заблокирован

Ниже приведено хорошее решение на Java!

NumberFormat fmt = NumberFormat.getCurrencyInstance();
System.out.println(fmt.format(n));

или для более надежного способа получить локаль определенного места, а затем использовать как показано ниже:

int n=9999999;
Locale locale = new Locale("en", "US");
NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
System.out.println(fmt.format(n));

US Locale OUTPUT: $ 9,999,999.00

Выход немецкого языка

Locale locale = new Locale("de", "DE");

OUTPUT: 9.999.999,00 €

Индийский локальный выход

Locale locale = new Locale("de", "DE");

OUTPUT: Rs. 9,999,999.00

Выход в Эстонский локаль

Locale locale = new Locale("et", "EE");

OUTPUT: 9 999 999 €

Как вы можете видеть на разных выходах, вам не нужно беспокоиться о разделитель представляет собой запятую или точку или даже пространство, вы можете получить номер, отформатированный в соответствии со стандартами i18n

24
задан bbum 3 January 2010 в 18:56
поделиться

2 ответа

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

Предполагается, что вы разрабатываете для iPhone, этот режим UITrackingRunLoopMode. Если вы разрабатываете для Mac, есть аналогичное имя NSEventTrackingRunLoopMode.

NSRunLoop *runloop = [NSRunLoop currentRunLoop];
NSTimer *timer = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(myTimerAction:) userInfo:nil repeats:YES];
[runloop addTimer:timer forMode:NSRunLoopCommonModes];
[runloop addTimer:timer forMode:UITrackingRunLoopMode];
48
ответ дан Ashley Clark 28 November 2019 в 22:30
поделиться

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

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

Для установки типа пуск / пауза / перезапуск / остановка вы обычно хотите:

  • получить время при запуске (либо в качестве экземпляра NSDate, либо в качестве значения NSTimeInterval)

  • после паузы или остановки, захватите время после паузы / остановки. Вычтите время начала из этого времени, и у вас будет длительность интервала

  • при перезапуске, захватите время при перезапуске , но также держитесь за уже истекшую длительность

  • при паузе / остановке, захватить время при паузе / остановке и добавить уже истекшую длительность

В общем, делать все это со значениями NSTimeInterval - которые просто удваиваются - проще всего. Однако, если вам нужно отслеживать фактический момент времени, когда произошли события, используйте вместо этого экземпляры NSDate.

22
ответ дан bbum 28 November 2019 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: