Трудно отследить такие проблемы. В целом ваш сценарий выглядит нормально. Вот некоторые идеи, которые могут помочь с вашей проблемой.
Как правило, текстовые сценарии apple интерпретируются во время выполнения, что означает, что каждый раз, когда вы запускаете свой сценарий, байт-код должен быть изменен на код машинного языка другой программой (бегунок яблочного скрипта) ... обычно это не проблема, но в твоем случае, может быть, это вызывает некоторую медлительность. Так что идея состоит в том, чтобы написать свой сценарий, чтобы этого не происходило. Мы можем сделать это, сохранив сценарий как приложение appleScript, поскольку приложения сохраняются в форме машинного языка и, следовательно, не требуют другой программы для выполнения кода. Кроме того, мы можем воспользоваться тем, что команды для обоих приложений идентичны, поэтому мы можем использовать блок «использование терминов». В своем коде вы дважды запрашиваете системные события для «имени процессов», поэтому последняя оптимизация, которую мы можем выполнить, - это сделать это только один раз.
Так что попробуйте и посмотрите, поможет ли это. Я не уверен, что это будет, но это стоит попробовать. Не забудьте сохранить его как приложение.
tell application "System Events" to set pNames to name of application processes
if "Rdio" is in pNames then
set appName to "Rdio"
else if "iTunes" is in pNames then
set appName to "iTunes"
else
return
end if
using terms from application "iTunes"
tell application appName
if player state is paused or player state is stopped then
play
else if player state is playing then
pause
end if
end tell
end using terms from
РЕДАКТИРОВАТЬ: Если приведенный выше код не работает, попробуйте это. Как уже упоминалось, попробуйте в качестве приложения и посмотрите, поможет ли это. Применяются те же принципы ... на один запрос меньше системных событий и сохранение в виде приложения, чтобы избежать необходимости интерпретировать код.
tell application "System Events" to set pNames to name of application processes
if "Rdio" is in pNames then
tell application "Rdio"
if player state is paused or player state is stopped then
play
else if player state is playing then
pause
end if
end tell
else if "iTunes" is in pNames then
tell application "iTunes"
if player state is paused or player state is stopped then
play
else if player state is playing then
pause
end if
end tell
end if