Получение времени, прошедшего в Objective-C

Мне нужно получить время, прошедшее между двумя событиями, например, появление UIView и первая реакция пользователя.

Как я могу достичь этого в Objective-C?

NSDate *start = [NSDate date]; // do stuff... NSTimeInterval timeInterval = [start timeIntervalSinceNow]; 

timeInterval – это разница между началом и теперь, в секундах, с точностью до миллисекунды.

Вы не должны полагаться на [NSDate date] для целей синхронизации, поскольку она может превышать или [NSDate date] прошедшее время. Есть даже случаи, когда ваш компьютер будет, по-видимому, путешествовать во времени, так как прошедшее время будет отрицательным! (Например, если часы перемещаются назад во время синхронизации).

По словам Арии Хагиги в лекции «Advanced IOS Gesture Recognition», посвященной курсу Winterford Stanford iOS (34:00), вы должны использовать CACurrentMediaTime() если вам нужен точный временной интервал.

Objective-C:

 #import  
 CFTimeInterval startTime = CACurrentMediaTime(); // perform some action CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime; 

Swift:

 let startTime = CACurrentMediaTime() // perform some action let elapsedTime = CACurrentMediaTime() - startTime 

Причина в том, что [NSDate date] синхронизируется на сервере, поэтому это может привести к «синхронизациям с синхронизацией по времени», что может привести к очень сложным ошибкам. CACurrentMediaTime() , с другой стороны, является временем устройства, которое не изменяется с помощью этих сетевых синхронизаций.

Вам нужно будет добавить среду QuartzCore к настройкам вашей цели.

Использовать метод timeIntervalSinceDate

 NSTimeInterval secondsElapsed = [secondDate timeIntervalSinceDate:firstDate]; 

NSTimeInterval – это всего лишь double определение в NSDate :

 typedef double NSTimeInterval; 

Для любого, кто придет сюда, ищет реализацию getTickCount () для iOS, вот мой вопрос после объединения разных источников:

 #include  #include  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; } 

Для измерений времени измерения (например, GetTickCount) также взгляните на mach_absolute_time и на этот вопрос Apple Q & A: http://developer.apple.com/qa/qa2004/qa1398.html .

используйте функцию timeIntervalSince1970 classа NSDate, как показано ниже:

 double start = [startDate timeIntervalSince1970]; double end = [endDate timeIntervalSince1970]; double difference = end - start; 

в основном, это то, что я использую для сравнения разницы в секундах между двумя разными датами. также проверьте эту ссылку здесь

Другие ответы правильны (с оговоркой *). Я добавляю этот ответ просто, чтобы показать пример использования:

 - (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 время NSDate может двигаться вперед или назад в любой момент.

  • Почему мой коллега MCSession отключается случайно?
  • Значение предупреждения "во время презентации!"
  • UIWebView - Как определить последнее сообщение webViewDidFinishLoad?
  • @synthesize vs @dynamic, каковы различия?
  • Как запустить UITableView на последней ячейке?
  • Как использовать метод prepareForReuse
  • iphone error: expected '=', ',', ';', 'asm' или '__attribute__' перед '' foo '
  • iPhone SDK: в чем разница между loadView и viewDidLoad?
  • Пользовательский пузырь выноски MKPinAnnotation похож на пузырь по умолчанию
  • Как написать данные в plist?
  • Свойства IBOutlet не обновляются при использовании метода prepareForSegue
  • Давайте будем гением компьютера.