Preciso calcular o tempo decorrido entre dois eventos, por exemplo, a aparência de um UIView e a primeira reação do usuário.
Como posso alcançá-lo no Objective-C?
ios
objective-c
Ilya Suzdalnitski
fonte
fonte
fabs(...)
para obter o valor absoluto de um flutuador. Por exemplo.NSTimeInterval timeInterval = fabs([start timeIntervalSinceNow]);
[NSDate date]
pode levar a erros de rastreamento difíceis, consulte esta resposta para obter mais informações.Você não deve confiar
[NSDate date]
para fins de tempo, pois isso pode subestimar ou subnotificar o tempo decorrido. Existem até casos em que seu computador aparentemente viaja no tempo, já que o tempo decorrido será negativo! (Por exemplo, se o relógio retroceder durante o tempo.)De acordo com Aria Haghighi na palestra "Reconhecimento avançado de gestos para iOS" do curso de inverno de 2013 em Stanford para iOS (34:00), você deve usar
CACurrentMediaTime()
se precisar de um intervalo de tempo preciso.Objetivo-C:
Rápido:
O motivo é que a
[NSDate date]
sincronização no servidor pode levar a "soluços de sincronização de tempo", o que pode levar a erros muito difíceis de rastrear.CACurrentMediaTime()
, por outro lado, é um horário do dispositivo que não muda com essas sincronizações de rede.Você precisará adicionar a estrutura QuartzCore às configurações do seu alvo.
fonte
[NSDate date]
dentro de um bloco de conclusão dentro de um bloco de despacho, eu estava recebendo o mesmo horário "atual" relatado[NSDate date]
imediatamente antes da execução atingir o ponto em que meus blocos foram criados.CACurrentMediaTime()
resolveu esse problema.CACurrentMediaTime()
para de marcar quando o dispositivo entra no modo de suspensão. Se você testar com o dispositivo desconectado de um computador, bloqueie-o e aguarde ~ 10 minutos para descobrir queCACurrentMediaTime()
não acompanha o relógio de parede.Use o
timeIntervalSinceDate
métodoNSTimeInterval
é apenas adouble
, definaNSDate
assim:fonte
Para quem vem aqui procurando uma implementação getTickCount () para iOS, aqui está o meu depois de reunir várias fontes.
Anteriormente, eu tinha um bug neste código (dividido por 1000000 primeiro), que estava causando uma quantização da saída no meu iPhone 6 (talvez esse não fosse um problema no iPhone 4 / etc ou simplesmente nunca percebi). Observe que, ao não executar essa divisão primeiro, há algum risco de estouro se o numerador da base de tempo for bastante grande. Se alguém estiver curioso, há um link com muito mais informações aqui: https://stackoverflow.com/a/23378064/588476
À luz dessa informação, talvez seja mais seguro usar a função da Apple
CACurrentMediaTime
!Também
mach_timebase_info
comparei a chamada e ela leva aproximadamente 19ns no meu iPhone 6, então removi o código (não thread-safe) que estava armazenando em cache a saída dessa chamada.Esteja ciente do risco potencial de estouro, dependendo da saída da chamada da base de tempo. Eu suspeito (mas não sei) que pode ser uma constante para cada modelo de iPhone. no meu iPhone 6 era
125/3
.A solução usando
CACurrentMediaTime()
é bastante trivial:fonte
mach_timebase_info()
redefinirá o passadomach_timebase_info_data_t
para{0,0}
antes de defini-lo para os valores reais, o que pode causar divisão por zero se o código for chamado de vários threads. Use emdispatch_once()
vez disso (ouCACurrentMediaTime
que seja apenas o tempo de conversão de segundos para segundos).Para medições de tempo percise (como GetTickCount), consulte também mach_absolute_time e as perguntas e respostas desta Apple: http://developer.apple.com/qa/qa2004/qa1398.html .
fonte
use a função timeIntervalSince1970 da classe NSDate como abaixo:
Basicamente, é isso que eu uso para comparar a diferença em segundos entre duas datas diferentes. verifique também este link aqui
fonte
As outras respostas estão corretas (com uma ressalva *). Eu adiciono esta resposta simplesmente para mostrar um exemplo de uso:
No console do depurador, você vê algo assim:
* Advertência: Como outros mencionados, use
NSDate
para calcular o tempo decorrido apenas para fins casuais. Um desses objetivos pode ser o teste comum, o perfil bruto, no qual você deseja apenas uma idéia aproximada de quanto tempo um método está demorando.O risco é que a configuração da hora atual do relógio do dispositivo possa mudar a qualquer momento devido à sincronização do relógio da rede. Portanto, o
NSDate
tempo pode pular para frente ou para trás a qualquer momento.fonte