Ich brauche Zeit, die zwischen zwei Ereignissen verstrichen ist: zum Beispiel zwischen dem Erscheinen von UIView und zwischen der ersten Reaktion des Benutzers.Abrufen der verstrichenen Zeit (Objective-c)
Antwort
NSDate *start = [NSDate date];
// do stuff...
NSTimeInterval timeInterval = [start timeIntervalSinceNow];
timeInterval
ist die Differenz zwischen Start- und jetzt, in Sekunden, mit sub-Millisekunden-Genauigkeit.
verwenden, um die timeIntervalSince1970 Funktion der NSDate Klasse wie unten:
double start = [startDate timeIntervalSince1970];
double end = [endDate timeIntervalSince1970];
double difference = end - start;
im Grunde, das ist, was ich verwende den Unterschied in Sekunden zwischen zwei verschiedenen Zeitpunkten zu vergleichen. überprüfen Sie auch diesen Link here
Für percise Zeitmessungen (wie GetTickCount), nehmen Sie auch einen Blick auf mach_absolute_time und dieses Bild Apple-Q & A: http://developer.apple.com/qa/qa2004/qa1398.html.
Verwenden Sie die timeIntervalSinceDate
Methode
NSTimeInterval secondsElapsed = [secondDate timeIntervalSinceDate:firstDate];
NSTimeInterval
ist nur ein double
definieren in NSDate
wie folgt aus:
typedef double NSTimeInterval;
Für alle, hier kommt eine GetTickCount() -Implementierung für iOS sucht, ist hier meins nach dem zusammenstellen verschiedener quellen:
#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;
}
Wer weiß, warum der Aufruf mach_timebase_info redundant ist (void)? –
@SimonTillson das ist eine gute Frage - entweder war es erforderlich, eine Warnung zum Schweigen zu bringen, oder ich kopierte es von woanders und bemerkte nur nicht, es zu löschen. Ich kann mich nicht erinnern. –
Sie sollten sich nicht auf [NSDate date]
für Timing-Zwecke verlassen, da es die verstrichene Zeit zu viel oder zu wenig meldet. Es gibt sogar Fälle, in denen Ihr Computer scheinbar mit der Zeit fährt, da die verstrichene Zeit negativ ist! (Z. B. wenn sich die Uhr während des Timings rückwärts bewegt).
Laut Aria Haghighi in der Vorlesung "Advanced iOS Gesture Recognition" von Winter 2013 Stanford iOS course (34:00) sollten Sie CACurrentMediaTime()
verwenden, wenn Sie ein genaues Zeitintervall benötigen.
Objective-C:
#import <QuartzCore/QuartzCore.h>
CFTimeInterval startTime = CACurrentMediaTime();
// perform some action
CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime;
Swift:
let startTime = CACurrentMediaTime()
// perform some action
let elapsedTime = CACurrentMediaTime() - startTime
Der Grund dafür ist, dass [NSDate date]
Synchronisierungen auf dem Server, so dass es zu "Time-Sync-Schluckauf" führen könnte was zu sehr schwer zu verfolgenden Fehlern führen kann. CACurrentMediaTime()
, auf der anderen Seite ist eine Gerätezeit, die sich bei diesen Netzwerk-Synchronisationen nicht ändert.
Sie müssen add die QuartzCore framework zu den Einstellungen Ihres Ziels.
Bitte aktualisieren Sie dies. Obwohl ich denke, dass jeder zustimmen kann, dass NSDate Ihre erste Option sein sollte, hat dieser Vorschlag ein Problem von mir gelöst. Beim Aufruf von '[NSDate date]' in einem Completion-Block innerhalb eines Dispatch-Blocks erhielt ich die gleiche "aktuelle" Zeit, die von '[NSDate date]' unmittelbar vor der Ausführung an dem Punkt gemeldet wurde, an dem meine Blöcke erstellt wurden. 'CACurrentMediaTime()' löste dieses Problem. – n00neimp0rtant
Wie würden wir die elapsedTime für die Anzeige wie mm: ss verwenden? – CyberMew
Warum habe ich noch nie davon gehört ... – Morkrom
Andere Antworten sind korrekt (mit einem Vorbehalt *).Ich füge diese Antwort einfach ein Beispiel des Verbrauches zeigen:
- (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.
}
In der Debugger-Konsole Sie etwas sehen:
DEBUG Method '-[XMAppDelegate getYourAffairsInOrder]' ran. Elapsed: 0.033827 seconds.
* Caveat: Wie andere erwähnt Verwenden Sie NSDate
, um die abgelaufene Zeit nur für zufällige Zwecke zu berechnen. Ein solcher Zweck könnte ein gemeinsames Testen sein, ein grobes Profiling, bei dem Sie nur eine ungefähre Vorstellung davon haben möchten, wie lange eine Methode dauert.
Das Risiko besteht darin, dass sich die aktuelle Uhrzeiteinstellung des Geräts aufgrund der Synchronisierung des Netzwerktakts jederzeit ändern kann. So NSDate
Zeit könnte jederzeit vorwärts oder rückwärts springen.
- 1. Abrufen der verstrichenen Zeit mit DispatchTimer auf 1 Millisekunden Genauigkeit
- 2. Shell-Skript zur Berechnung der verstrichenen Zeit
- 3. Handhabung und Speicherung der verstrichenen Zeit
- 4. Transact-SQL zum Aufsummieren der verstrichenen Zeit
- 5. schnell verstrichenen Zeit auf Linux
- 6. CPU-Zeit im Vergleich zur verstrichenen Zeit in T-SQL
- 7. Oracle 11 Variable Empfindlichkeit der verstrichenen Zeit zu LINESIZE Änderungen
- 8. Einmaliger Timer zum Speichern (SharedPreferences) der verstrichenen Zeit in Aktivität
- 9. Berechnung der verstrichenen Zeit in einem C-Programm in Millisekunden
- 10. Filtern von Datenrahmen basierend auf der verstrichenen Zeit
- 11. Präzise Messung der verstrichenen Wanduhrzeit in .NET
- 12. Berechnen der verstrichenen Arbeitsstunden zwischen 2 Datetime
- 13. Warum werden Animationen manchmal mithilfe von Schritten ausgeführt, die auf der verstrichenen Zeit basieren?
- 14. ObjectiveC-Blöcke Java-Äquivalent
- 15. 2D Dynamische Speicherzuweisung - ObjectiveC
- 16. AMF0 Parser in ObjectiveC
- 17. Problem mit der Berechnung der verstrichenen Minuten zwischen zwei Daten
- 18. ObjectiveC: Wo private Instanzeigenschaften deklarieren?
- 19. ObjectiveC - wie NSUserNotification Kennung Eigenschaft
- 20. Präsentieren Sie kleine ModalViewController ObjectiveC
- 21. ObjectiveC - Anzeigefenster durch verteilte Objekte
- 22. Abrufen des Videoframes in der angegebenen Zeit Qt
- 23. Abrufen der Zeit von NTP-Server über PHP
- 24. Word Mail-Merge zeigt die verstrichenen Sekunden nicht korrekt an
- 25. ObjectiveC - Freigabe von Objekten als Parameter
- 26. TwitPic API von ObjectiveC/iPhone verwenden
- 27. Zeit in Xcode verwenden
- 28. ObjectiveC UISwitch Standard auf OFF setzen
- 29. Abrufen der Uhrzeit der empfangenen Nachricht
- 30. .NET - Ereignisüberlappung für abgelaufene Zeit
+1, Nizza und Osten Antwort. Vielen Dank. :) – mAc
so ist es ein negativer Wert, wenn ich richtig verstanden habe –
@NicolasZozol können Sie 'fabs (...)' verwenden, um den absoluten Wert eines Floats zu erhalten. Z.B. 'NSTimeInterval timeInterval = fabs ([start timeIntervalSinceNow]);' –