Como definir uma variável que represente um tempo no futuro em termos absolutos?
Motivação: Estou trabalhando em um aplicativo que faz com que vários telefones (clientes) leiam dados de áudio de um telefone (servidor). A ideia é que eles devemtodos tocar a música noexato mesmo tempo juntos.
Premissa: Eu preciso descobrir uma maneira de fazer com que todos os telefones iniciem em um determinado horário que seja absoluto (ou seja, não é relativo ao uso do relógio do telefone, etc.).pesquisa Eu percebi que a melhor maneira de fazer isso é usarCFAbsoluteTimeGetCurrent();
A idéia aqui é que eu recebo a latência necessária para o servidor se comunicar com cada telefone (b / c GKSession é feito em série aparentemente não paralelamente), adicionar essa latência à hora atual, e então fazer com que cada telefone toque a música a partir de essa hora de início. Esse horário de iníciodevo seja absoluto, não pode ser relativo.
Questão: Como posso representar um tempo no futuro em um número, que pode ser usado mais tarde para construir umCFDateRef. (A razão que tem que ser expressa como um número é que eu devo ser capaz de enviá-lo em um pacote ..)
Exemplo: Isso é um pouco de código que explica o que estou tentando alcançar:
-(void)viewDidLoad
{
_timer = [Timer new];
[_timer setCurrentTimeAsReferencepoint];
[self performSelector:@selector(performAction) withObject:NULL afterDelay:5];
}
-(void)performAction
{
double diff = [_timer getTimeElapsedinAbsTime];
double timeInFuture = diff + [Timer getCurTime];
NSLog(@"this is time in future in abs terms %f",timeInFuture);
CFDateRef futureDate = CFDateCreate(NULL, timeInFuture);
CFDateRef dateNow = CFDateCreate(NULL, [Timer getCurTime]);
Boolean keepTesting = true;
while (keepTesting) {
if (CFDateCompare(dateNow, futureDate,NULL) == 0) // ie both times are equal
{
NSLog(@"now is the time!");
keepTesting = false;
} else {
NSLog(@"now isn't the time.. skip");
}
}
}
em Timer.m:
-(void)setCurrentTimeAsReferencepoint
{
_referencePoint = [[self class] getCurTime];
NSLog(@"this is reference point %f",_referencePoint);
}
+(double)getCurTime
{
return (double)CFAbsoluteTimeGetCurrent();
}
// not used in the above code.. but used when i compare the time of the server phone with the client phone
+(double)getTimeDifference:(double)time1
time2:(double)time2
{
CFDateRef newDate = CFDateCreate(NULL, time2);
CFDateRef oldDate = CFDateCreate(NULL, time1);
CFTimeInterval difference = CFDateGetTimeIntervalSinceDate(newDate, oldDate);
NSLog(@"this is time difference %f",fabs(difference));
CFRelease(oldDate); CFRelease(newDate);
// fabs = absolute value
return fabs(difference);
}