Perché AppleScript in El Capitan funziona in modo diverso?

1

Perché in El Capitan questa app dice 3 1 2? Prima di El Capitan diceva 1 2 3.

Quando si fa doppio clic su questo script, è necessario dire 1 2 3.

on run
  say "1"
  testing()
end run

on testing()
  say "2"
end testing

on idle
  say "3"
  return 60
end idle

on quit
end quit
    
posta scriptee2 01.11.2015 - 07:28
fonte

2 risposte

3

I gestori di idle e quit sono per Applet , non Scripts. Applet e script sono diversi, tuttavia sono entrambi scritti in Applescript.

Un'applet, è un'applicazione di script, che supporta idle e quit handler, mentre lo script è come qualsiasi altro script in qualsiasi lingua; corre e fino alla fine, non sa quando sta per uscire, o quando è inattivo. Applet come qualsiasi altra applicazione, se fai clic con il pulsante destro del mouse e "Apri il contenuto del pacchetto" di un'applet vedrai la somiglianza. L'applet può avere risorse, può essere CodeSigned, può avere più script e condiviso senza problemi.

Questo è il tuo problema, scegli di salvare lo script come applicazione quando richiesto, seleziona anche "Rimani aperto dopo l'esecuzione del gestore" , quindi verrà eseguito il tuo idle handler.

Poche altre cose, è sempre una buona idea tornare da ogni gestore, che non sei in run e testing , questo può far sì che il idle handler non venga eseguito come sarà in attesa per run per finire. Dovresti anche inserire continue quit nel tuo quit handler, altrimenti non uscirà mai; dovrai forzare la chiusura.

Per ulteriori informazioni Guida lingue AppleScript

    
risposta data 01.11.2015 - 17:58
fonte
0

Primo: Non riesco a riprodurre il problema su OS X El Capitan 10.11 (15A284). Il tuo script dice "1", "2", "3" ogni volta che lo eseguo.

L'ordine esatto dei messaggi "run" e "idle" potrebbe non essere mai stato garantito, quindi potrebbe essere possibile che entrambi gli ordini ({1, 2, 3} e {3, 1, 2}) siano considerati corretti .

Tuttavia, se l'ordine dei messaggi di esecuzione e di inattività è importante per lo script, è possibile utilizzare una proprietà di script per consentire al gestore inattivo di sapere quando il gestore di esecuzione è già eseguito e non fare nulla finché non ha, ad esempio,

property didRun : false

on run
    say "1"
    testing()
    set didRun to true
end run

on testing()
    say "2"
end testing

on idle
    if not didRun then
        say "has not run"
        return 1
    end if

    say "3"
    return 3
end idle

on quit
    set didRun to false

    say "quit"
    continue quit
end quit

Tieni presente che è necessario reimpostare didRun nel gestore quit perché i valori delle proprietà normalmente persistono tra le esecuzioni (dopo essere stati riscritti nel file di script dopo l'esecuzione).

    
risposta data 06.11.2015 - 22:08
fonte

Leggi altre domande sui tag