Мне нужно получить время, прошедшее между двумя событиями: например, между появлением UIView и между первой реакцией пользователя.Получение времени, прошедшего (Objective-c)
ответ
NSDate *start = [NSDate date];
// do stuff...
NSTimeInterval timeInterval = [start timeIntervalSinceNow];
timeInterval
разница между началом и в настоящее время, в секундах, с суб-точностью до миллисекунд.
использовать функцию timeIntervalSince1970 класса NSDate, как показано ниже:
double start = [startDate timeIntervalSince1970];
double end = [endDate timeIntervalSince1970];
double difference = end - start;
в основном, это то, что я использую, чтобы сравнить разницу в секундах между 2 разными датами. Кроме того, проверьте эту ссылку here
Для percise измерения времени (например, GetTickCount), а также смотреть на mach_absolute_time и это Apple, Q & A: http://developer.apple.com/qa/qa2004/qa1398.html.
Используйте timeIntervalSinceDate
метод
NSTimeInterval secondsElapsed = [secondDate timeIntervalSinceDate:firstDate];
NSTimeInterval
является просто double
, определяет в NSDate
так:
typedef double NSTimeInterval;
Ни для кого приходит сюда в поисках реализации GetTickCount() для прошивки, здесь после объединения различных источников:
#include <mach/mach.h>
#include <mach/mach_time.h>
uint64_t getTickCount(void)
{
static mach_timebase_info_data_t sTimebaseInfo;
uint64_t machTime = mach_absolute_time();
// Convert to nanoseconds - if this is the first time we've run, get the timebase.
if (sTimebaseInfo.denom == 0)
{
(void) mach_timebase_info(&sTimebaseInfo);
}
// Convert the mach time to milliseconds
uint64_t millis = ((machTime/1000000) * sTimebaseInfo.numer)/sTimebaseInfo.denom;
return millis;
}
Кто-нибудь знает, почему на вызове mach_timebase_info есть избыточный (void)? –
@SimonTillson - хороший вопрос - либо нужно было заставить замолчать предупреждение, либо я скопировал его из другого места и просто не заметил, чтобы удалить его. Я не помню. –
Вы не должны полагаться на [NSDate date]
для целей синхронизации, так как оно может превышать или недооценивать прошедшее время. Есть даже случаи, когда ваш компьютер будет, по-видимому, путешествовать во времени, так как прошедшее время будет отрицательным! (Например, если часы перемещаются назад во время.)
Согласно Aria Хагиге в «Advanced IOS Gesture Recognition» лекции Winter 2013 Stanford iOS course (34:00), вы должны использовать CACurrentMediaTime()
если вам нужен точный промежуток времени.
Objective-C:
#import <QuartzCore/QuartzCore.h>
CFTimeInterval startTime = CACurrentMediaTime();
// perform some action
CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime;
Свифта:
let startTime = CACurrentMediaTime()
// perform some action
let elapsedTime = CACurrentMediaTime() - startTime
Причина заключается в том, что [NSDate date]
синхронизируется на сервере, так что это может привести к "икота времени синхронизации" что может привести к очень сложным ошибкам. С другой стороны, CACurrentMediaTime()
- это время устройства, которое не изменяется при этих сетевых синхронизациях.
Вам необходимо установить add в положение QuartzCore framework в настройки вашей цели.
Пожалуйста, воздержитесь от этого. Хотя я думаю, что каждый может согласиться с тем, что NSDate должен быть вашим первым вариантом, это предложение разрешило мою проблему. При вызове '[NSDate date]' в блоке завершения в блоке отправки я получал то же самое «текущее» время, которое сообщалось в [NSDate date] 'непосредственно перед тем, как выполнение достигло точки, в которой были созданы мои блоки. 'CACurrentMediaTime()' решил эту проблему. – n00neimp0rtant
Как использовать elapsedTime для отображения, например mm: ss? – CyberMew
Почему я никогда не слышал об этом ... – Morkrom
Другие ответы правильные (с оговоркой *).Я добавляю этот ответ просто, чтобы показать пример использования:
- (void)getYourAffairsInOrder
{
NSDate* methodStart = [NSDate date]; // Capture start time.
// … Do some work …
NSLog(@"DEBUG Method %s ran. Elapsed: %f seconds.", __func__, -([methodStart timeIntervalSinceNow])); // Calculate and report elapsed time.
}
На консоли отладчика, вы видите что-то вроде этого:
DEBUG Method '-[XMAppDelegate getYourAffairsInOrder]' ran. Elapsed: 0.033827 seconds.
* Оговорка: Как другие упомянули , используйте NSDate
для расчета прошедшего времени только для случайных целей. Одной из таких целей может быть обычное тестирование, сырое профилирование, где вам просто нужно грубое представление о том, как долго проходит метод.
Риск состоит в том, что установка текущего времени часов устройства может измениться в любой момент из-за синхронизации сетевых часов. Так что NSDate
время может прыгать вперед или назад в любой момент.
- 1. Получение прошедшего времени мобильного соединения
- 2. Qt: Получение прошедшего времени функции члена потока
- 3. Получение времени, прошедшего как UILabel (цель-c)
- 4. Расчет прошедшего времени метода
- 5. R вычисление прошедшего времени
- 6. Несколько счетчиков прошедшего времени
- 7. Добавление времени, прошедшего часть
- 8. Измерение прошедшего времени удаленно
- 9. Калькулятор прошедшего времени Javascript
- 10. PHP Проверка прошедшего времени
- 11. Формула кристалла прошедшего времени
- 12. Определение прошедшего времени
- 13. Поиск прошедшего времени
- 14. Получение времени, прошедшего в программе на C с использованием часов()
- 15. Получение NaN при вычислении прошедшего времени в Java
- 16. C# Получение возвращаемого значения из прошедшего времени Событие
- 17. получение прошедшего времени видео с помощью медиа-рекордера в android
- 18. Batch: Расчет времени, прошедшего с отметками времени
- 19. Измерение прошедшего времени в QML
- 20. Обработка и хранение прошедшего времени
- 21. Отображение времени, прошедшего с эпохи
- 22. Получение индекса значения, прошедшего в
- 23. Добавление одной миллисекунды к текущему времени objectivec
- 24. Столбец прошедшего времени ObjectListView Потенциально необходимо многопоточность
- 25. Измерение прошедшего времени в OS X
- 26. Использовать аннотацию для вычисления прошедшего времени метода
- 27. Расчет количества времени, прошедшего между 2 датами
- 28. Сокращение времени, прошедшего переменную, в управляемые вещи
- 29. Скрытие получения прошедшего времени в C
- 30. Фильтрация фрейма данных на основе прошедшего времени
+1, Ницца и Восток Ответ. Благодарю. :) – mAc
, так что это отрицательное значение, если я правильно понял –
@NicolasZozol вы можете использовать 'fabs (...)', чтобы получить абсолютное значение float. Например. 'NSTimeInterval timeInterval = fabs ([start timeIntervalSinceNow]);' –