Я базово вычисляю мгновенную скорость, а затем использую метод setSpeed (), чтобы добавить его в местоположение. Его довольно точно, потому что я сравнивал его внутри транспортного средства, где я мог проверить тахеометр.
private double calculateInstantaneousSpeed(Location location) {
double insSpeed = 0;
if (y1 == null && x1 <= -1) {
//mark the location y1 at time x1
y1 = location;
x1 = duration.getDurationAsSeconds();
} else {
//mark the location y2 at time x2
y2 = location;
x2 = duration.getDurationAsSeconds();
//calculate the slope of the curve (instantaneous speed)
dy = y1.distanceTo(y2);
dx = x2 - x1;
insSpeed = dy / dx;
y1 = y2;
x1 = x2;
}
Singleton.getInstance().instantaneousSpeedSamples.add(insSpeed);
//System.out.println("Instantaneous Speed m/s: "+insSpeed);
return insSpeed;
}
Из Apple Docs ;
. Примечание
. Монитор
blockquote>Block
вызывается для всех будущих событий, соответствующих маске. Вы должны позвонитьremoveMonitor(_:)
, чтобы остановить монитор. При сборке мусора монитор (и все, что ссылается на Блок) не будет собираться до тех пор, пока не будет вызванremoveMonitor(_:)
.Это означает, что монитор будет продолжать поиск совпадающих событий, пока не будет вызвано
removeMonitor()
. Таким образом, ваша система использует дополнительную память для продолжения поиска событий, и если вы никогда не вызовете это - это может привести к довольно большой утечке памяти. Как говорится даже при сборке мусора, этот объект все еще выделяется - потому что он ищет события, которые могут произойти в любое время (поэтому не гарантируется, что он будет собран). Обязательно звоните, когда хотите, чтобы система перестала искать события.Вы также можете сделать что-то подобное в вашем
handler
.Вы можете вернуть событие без изменения, создать и вернуть новый объект NSEvent или вернуть nil, чтобы остановить отправку события.
BLOCKQUOTE>