Как установить переменную, которая представляет время в абсолютном выражении цель C
Мотивация: я работаю над приложением, которое заставляет несколько (клиентских) телефонов считывать аудиоданные с (серверного) телефона. Идея состоит в том, что они все должны играть песню в одно и то же время вместе.
Предпосылка: я должен найти способ заставить все телефоны запускаться с определенной отметкой времени, которая является абсолютной (то есть это не относится к установленным часам использования любого телефона и т. Д.).. Основываясь на некоторых исследованиях, я нашел лучший способ сделать это, чтобы использовать CFAbsoluteTimeGetCurrent();
Идея заключается в том, что я получаю задержку, необходимую серверу для связи с каждым телефоном (очевидно, что сеанс GKSession выполняется последовательно, а не параллельно), добавляю эту задержку к текущему времени, а затем каждый телефон воспроизводит песню, начиная с это время начала. Это время начала должно быть абсолютным, оно не может быть относительным.
Вопрос: Как я могу представить время в будущем числом, которое позже можно будет использовать для построения CFDateRef. (Причина, по которой оно должно быть выражено в виде числа, заключается в том, что я должен иметь возможность отправить его в пакете...)
Пример: это небольшой фрагмент кода, который объясняет, чего я пытаюсь достичь:
-(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");
}
}
}
в 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);
}
1 ответ
Оказывается, это проще, чем я думал (примечание: в вопросе определено getCurTime):
-(void)performAction
{
double curTime = [Timer getCurTime];
double timeInFuture = 2 + curTime;
NSLog(@"this is time in future in abs terms %f and this is curTime %f",timeInFuture, curTime);
CFDateRef futureDate = CFDateCreate(NULL, timeInFuture);
CFDateRef dateNow = CFDateCreate(NULL, curTime);
Boolean keepTesting = true;
while (keepTesting) {
dateNow = CFDateCreate(NULL, [Timer getCurTime]);
if (CFDateCompare(dateNow, futureDate,NULL) >= 0) // ie both times are equal or we've
// gone past the future date time
{
NSLog(@"now is the time!");
keepTesting = false;
return;
} else {
NSLog(@"now isn't the time.. skip");
}
}
}