Cum funcționează automatorul os x, arhitectura pachetelor de pachete încărcabile, Apple, dezvoltator de xcode

Arhitectura pachetelor Bundle descărcabile

Aplicația Automator se bazează pe arhitectura pachetelor de pachete încărcate. Încarcă pachetele încărcate invocă acțiuni și execută un cod care este conținut într-o secvență definită de fluxul de lucru curent, traducând fluxuri de date de la o acțiune la alta.







Fiecare acțiune este ambalată ca pachet descărcabil sau în cazul acțiunilor AppleScript bazate pe pachete potențial descărcabile. Pachetul de descărcări conține resurse de diferite tipuri și, de obicei, cod binar, dar nu este capabil să execute singur acest cod. Structura internă a pachetelor de pachete de cacao este prezentată într-o formă care "înțelege" obiectul NSBundle. Folosind un obiect NSBundle, o aplicație sau o bibliotecă poate încărca resursele și codul pachetelor încărcate în timpul rulării și le poate integra cu codul pe care le conține deja. Loturile de pachete încărcabile au, în esență, o arhitectură plug-in.

Când se pornește, Automator scanează imediat acțiunile pachetului instalat și extrage din lista de informații a proprietăților fiecărui pachet (Info.plist) informațiile necesare pentru ao afișa și a le pregăti pentru utilizare. Acțiunile de acționare (sub formă de pachete descărcabile) sunt stocate în locații standard de către sistemul de fișiere:

/ System / Library / Automator - acțiunile Apple

/ Library / Automator - Alte activități pentru toți utilizatorii

/ Library / Automator - Alte acțiuni pentru utilizatorul curent

Automator, de asemenea, caută acțiunile stocate în pachetele de pachete ale oricărei aplicații înregistrate.

Când pornește, Automator încarcă orice cod Mach-O pe care îl găsește în pachetul de acțiuni, care în acest caz este acțiunea Objective-C a numai referințe externe permise în acest proces. Dacă acțiunea se bazează pe Obiectiv-C, instanța AMBundleAction (sau o subclasă a acelei clase) este dezarhivată de la vârf. Cu toate acestea, dacă acțiunea este construită complet pe script-uri AppleScript sau shell, Automator stochează link-ul către pachet, deoarece nu există nici un cod Mach-O care să se încarce. Când utilizatorul trage această acțiune în zona fluxului de lucru Automator pentru prima dată, aplicația încarcă acțiunea, fișierul nib este despachetat și afișează tipul de acțiune.

Flux de lucru nou

Când un utilizator creează un flux de lucru nou tragând una sau mai multe acțiuni în aspectul fluxului de lucru, Automator face mai multe lucruri:

Dacă acțiunea se bazează pe AppleScript, ea creează o instanță a AMAppleScriptAction ca proprietar al pachetului și încarcă scriptul, astfel încât AppleScript Studio poate efectua o anumită inițializare. Dacă acțiunea se bazează pe un script shell, Automator creează o instanță a AMShellScriptAction.

El devine o idee de conținut inclus în pachetul de acțiune și o afișează în formă de acțiune în domeniul fluxului de lucru, stabilirea de valori implicite pentru câmpuri și controale de text, astfel cum sunt definite în acțiune de proprietate AMDefaultParameters.

Extragerea din arhiva fluxului de lucru

Când salvați un flux de lucru sau îl copiați prin clipboard, fluxul de lucru și toate acțiunile acestuia sunt arhivate. Automator apelează metoda writeToDictionary: fiecare dintre acțiunile din fluxul de lucru direcționate către dicționarul modificat, cu parametrii de acțiune și alte informații. Acțiunea poate alege să modifice conținutul dicționarului înainte de a reveni la textul writeToDictionary. Apoi, dicționarele combinate ale fiecărei acțiuni de flux de lucru sunt codificate și arhivate.

După ce toate acțiunile din fluxurile de lucru au fost reinitializate din arhivă, fluxul de lucru este gata de utilizare. Utilizatorii pot selecta opțiunile din acțiuni și pot începe fluxul de lucru.

Efectele software ale pachetelor descărcabile

Accesați pachetul Bundle

Una dintre problemele cu pachete provine de la diferențele dintre pachetele principale de aplicații cum ar fi Automator și pachetele care sunt descărcate de aplicații. Dacă solicitați pachetul principal din codul dvs. de acțiune, de exemplu:

NSBundle * theBundle = [NSBundle mainBundle];

primiți pachetul principal al aplicației Automator, nu pachetul de acțiuni care apelează mainBundle. Pentru un pachet de acțiune, trebuie să trimiteți un mesaj pachetului de obiecte de acțiune (care, de regulă, pune în aplicare codul de acțiune):

NSBundle * theBundle = [singur pachet];

Metoda bundle este declarată în clasa AMBundleAction, toate acțiunile acesteia fiind moștenite din clasă, direct sau indirect







Dezarhivarea fișierului de creion

Programele de cacao implementează adesea metoda awakeFromNib (colegul său din mânerul AppleScript al comenzii awake from nib). Metoda awakeFromNib este apelată atunci când toate obiectele din fișierul de nib al programului au fost dezarhivate. Acest lucru oferă programului capacitatea de a efectua inițializarea, care necesită prezența tuturor obiectelor extrase din arhivă.

Cu toate acestea, metoda awakeFromNib este apelată când automatizatorul este pornit. În acest moment, Automator citește orice cod de acțiune binar în locațiile standard ale Automator și dezarhivează direct obiectele din fișierele de fișiere pe care le deține în mod direct. Cu toate acestea, aceste obiecte nu includ obiecte în fișierele de acțiune ale dispozitivului. Fișierul de acțiuni al nibului nu este încărcat și obiectele acestuia nu sunt arhivate până când utilizatorii nu trag acțiunea în fluxul de lucru. Dacă doriți să efectuați o inițializare care necesită prezența tuturor obiectelor și a legăturilor din fișierul de acțiune al nibului, implementați metoda deschisă în loc de awakeFromNib.

Spațiu de nume

Clasa Objective-C definește un spațiu de nume pentru metodele și variabilele de instanțe pe care le declară. În această privință, aceleași metode și variabile în alte clase nu cauzează conflicte în acest proces. Cu toate acestea, numele clasei însăși există în spațiul de nume ocupat de toate clasele încărcate de proces. În plus, toate simbolurile globale (de exemplu, funcțiile și tipurile de date) se află, de asemenea, în același spațiu de nume în proces.

Pentru Automator, cu pachetele sale arhitectura încărcate (sau plug-in-uri), probabilitatea unei potențiale conflicte de nume și, prin urmare, probabilitatea -escaping de rulare este semnificativă. Automator poate descărca potențial sute de acțiuni din diferite surse, de exemplu, în cazul în care două acțiuni de clasă au același nume sau să declare un șir constant cu același nume, există potențialul pentru un conflict de nume, atunci când aceste acțiuni sunt încărcate Automator.

Pentru a evita conflictele de nume, se recomandă să atribuiți prefixelor tuturor clasei și tipurilor globale care sunt cât se poate de distinctive. De exemplu, dacă numele companiei dvs. este Acme, puteți denumi clasa AC_FilterImages.

Arhitectura de streaming

Pentru a îmbunătăți stabilitatea și performanța, AppleScript furnizează acțiuni bazate pe accesul la resurse, cum ar fi Standard Additions, Automator are o arhitectură de streaming care pune diferite tipuri de activități de program în fire separate. Automator pornește procesul lucrătorului pe firul secundar (adică un fir diferit de firul principal). Dar începe fiecare acțiune într-un fir diferit, în funcție de faptul dacă acțiunea se bazează pe AppleScript sau Obiectiv-C:

  • Dacă acțiunea se bazează pe AppleScript, este executată pe firul principal. Implementarea permite utilizatorilor să anuleze acțiunea pe acest thread făcând clic pe butonul stop.
  • Dacă acțiunea se bazează pe obiectivul C sau pe scriptul shell, acesta este executat pe firul secundar.

Această arhitectură de streaming impune restricții asupra ambelor moduri de scriere a acțiunilor, atât pe baza AppleScript cât și a obiectivului C. Dacă acțiunea bazată pe AppleScript folosește scriptul shell shell. interfața de utilizator nu răspunde până când scriptul nu se termină; singura modalitate prin care utilizatorii pot anula execuția este să apăsați pe perioada de comandă. În cazul în care ferestrele de afișare Objective-C de acțiune, acestea ar trebui să o facă în fluxul principal folosind o metodă cum ar fi performSelectorOnMainThread: withObject: waitUntilDone :.

Clase de automatizare

Automatorul ca o tehnologie include nu numai aplicațiile și acțiunile sale, ci și biblioteca Automator (Automator.framework). Biblioteca pune în aplicare cele mai multe dintre comportamentul general al acțiunii, și oferă o interfață comună, care este definită de patru clase: AMAction, AMBundleAction, AMAppleScriptAction și AMShellScriptAction. Aceste clase sunt legate ierarhic (în termeni de moștenire), după cum se arată în figura de mai jos.

Cum funcționează automatorul os x, arhitectura pachetelor de pachete încărcabile, Apple, dezvoltator de xcode

Clasa AMBundleAction este moștenită direct de la AMAction și oferă implementarea concretă. AMBundleAction definește interfața și comportamentul general al acțiunilor care sunt pachete descărcabile. Obiectele AMBundleAction au trei proprietati principale:

Acțiunile pachet-batch concepute cu vizualizări de vizualizări, resurse pachete sunt disponibile și sunt disponibili parametrii pentru acțiune. Acestea extind pachetele de acțiuni descărcate, astfel încât scripturile sau scripturile AppleScript să poată controla logica acțiunii, în loc de codul Obiectiv-C (deși AppleScript, Obiectiv-C și chiar codul scriptului de shell pot fi amestecate în implementarea acțiunii). Singura cale de ieșire este AMAppleScriptAction OSAScript obiect care reprezintă un scenariu în mod implicit, această ieșire este setat pe un obiect care reprezintă main.applescript.

Puteți crea propriile sub-clase în ultimele două niveluri ale ierarhiei de clasa Automator, adică AMBundleAction în jos pentru a obține obiecte cu caracteristici și capabilități ca ai nevoie. Dacă doriți să creați o acțiune de pachet-pack descărcabil al cărui comportament este determinat de limbajul de scripting diferit de AppleScript, Perl, Python, script de shell, v-ar crea o AMBundleAction subclasă.

Conceptual, cei doi factori externi principali ai acțiunii sunt obiectele de intrare care i-au fost transmise din acțiunea anterioară (dacă există) și parametrii specificați de utilizatori utilizând comenzile și câmpurile de text ale tipului de acțiune. În instanța AMBundleAction, un obiect de intrare este disponibil în runWithInput: fromAction: error: implementarea și primirea parametrilor direct de la interfața de utilizator prin intermediul mecanismului de legare a cocoașilor. Pentru acțiunile bazate pe AppleScript (reprezentate, de exemplu, AMAppleScriptAction), parametrii de intrare ai obiectului sunt și mai pronunțați. Ele apar ca valori transmise manipulatorului de pornire. după cum se arată în figura de mai jos:

Cum funcționează automatorul os x, arhitectura pachetelor de pachete încărcabile, Apple, dezvoltator de xcode







Trimiteți-le prietenilor: