Как работает Automator

Следующие разделы описывают среду разработки, архитектуру среды выполнения и иерархию классов для действий Automator.

Компоненты разработки Automator

Среда разработки XCode интегрирует много технологий для создания действия, программируя максимально эффективный:

Конечный продукт всех этих компонентов, когда действие создается, является загружаемым пакетом.

Загружаемая архитектура пакета

Приложение Automator основывается на загружаемой архитектуре пакета. Это загружается, загружаемые пакеты вызвали действия и выполняют код, который они содержат в последовательности, определенной текущим потоком операций, передавая поток по каналу данных от одного действия до следующего.

Каждое действие упаковывается как загружаемый пакет — или в случае находящихся в AppleScript действий, потенциально загружаемого пакета. Загружаемый пакет содержит ресурсы различных видов и обычно двоичного кода, но это не способно к выполнению того кода самостоятельно. Внутренняя структура пакета Какао находится в форме, которую «понимает» объект NSBundle. Используя объект NSBundle, приложение или платформа могут загрузить ресурсы и код загружаемого пакета во время выполнения и интегрировать их с тем, что это уже содержит. Загружаемые пакеты являются по существу сменной архитектурой.

Когда это запускается, Automator сразу сканирует в настоящее время устанавливаемые пакеты действия и извлекает из информационного списка свойств каждого пакета (Info.plist) информация, необходимая, чтобы вывести на экран его и подготовить его к использованию (см. рисунок 1). Действия Automator (в форме загружаемых пакетов) сохранены в стандартных расположениях файловой системы:

Automator также ищет действия, которые сохранены в пакетах любых зарегистрированных приложений. Посмотрите Тестирование, Отладку и Установку Действия для получения информации об установке действий в пакетах их связанных приложений.

Рисунок 1  , Когда запущено, Automator получает информацию о доступных действиях
When launched, Automator gets information about available actionsWhen launched, Automator gets information about available actions

Когда это запускается, Automator также загружает любой Мужественный код, который это находит в пакетах действия — которые в этом случае являются действиями Objective C только — разрешение внешних ссылок в процессе. Если действие основывается на Objective C, экземпляр AMBundleAction (или подкласс того класса) разархивирован от пера. Однако, если действие полностью управляется AppleScript или сценарием оболочки, Automator вместо этого сохраняет ссылку на пакет, так как нет никакого Мужественного кода для загрузки. Когда пользователь перетащит такое действие в область потока операций Отомэтора впервые, загрузки приложения действие, разархивировав его файл пера, и выведет на экран представление действия (см. рисунок 2).

Рисунок 2  , Когда пользователь перетаскивает находящееся в AppleScript действие в поток операций, пакет загрузок Automator
When user drags AppleScript-based action into workflow, Automator loads bundleWhen user drags AppleScript-based action into workflow, Automator loads bundle

Архитектурные подробные данные после этого отличаются немного основанные, создается ли поток операций впервые или разархивирован.

Новый поток операций

Когда пользователь создает новый поток операций путем перетаскивания одного или более действий в представление расположения потока операций, Automator делает несколько вещей:

  • Если действие является находящимся в AppleScript, оно создает экземпляр AMAppleScriptAction как владелец пакета; это также загружает сценарий, таким образом, AppleScript Studio может выполнить некоторую инициализацию. Если действие основывается на сценарии оболочки, Automator создает экземпляр AMShellScriptAction вместо этого.

  • Это получает довольное представление, содержавшееся в пакете действия, и выводит на экран его в представлении действия в области потока операций, устанавливая значения по умолчанию текстовых полей и средств управления, как определено действием AMDefaultParameters свойство.

Пользователи изменяют параметры действия путем выбора раскрывающихся элементов, нажатия кнопок, введения текста в текстовые поля, и т.д. Когда поток операций готов, они щелкают по кнопке запуска для выполнения потока операций. С Automator, действующим как координатор, приложение и каждое действие выполняют следующие шаги в последовательности потока операций:

  • Automator вызывает runWithInput:fromAction:error: метод действия, передавая его вывод предыдущего действия, как введено.

    Классы AMAppleScriptAction и AMShellScriptAction обеспечивают реализацию по умолчанию этого метода для основанных на сценарии действий. Реализация AMAppleScriptAction вызывает on run Обработчик AppleScript.

  • Настройки, установленные в пользовательском интерфейсе действия, распространены как параметры к объекту действия через привязку Какао.

  • Объект действия (в большинстве случаев) берет ввод и, на основе параметров, преобразовывает его или делает то, что его установленная роль (такие как импорт его в приложение или отображение вывода).

  • Как его последний шаг, действие возвращает результат своей работы (ее вывод). Если это не влияет на данные, передал его как ввод, это просто возвращает его неизменный.

В то время как каждое действие занято, Automator выводит на экран вращающийся индикатор хода выполнения в представлении действия. Если ошибка происходит в действии, представление действия выводит на экран красный «X» и может вывести на экран сообщение об ошибке. Если действие успешно завершается, его представление выводит на экран зеленую галочку. Когда последнее действие закончило свою задачу, выполнение потока операций закончено.

Разархивированный поток операций

Когда пользователи сохраняют поток операций или копируют один через область монтажа (буфер обмена), поток операций и все его действия архивируются. Automator вызывает writeToDictionary: метод каждого из действий в потоке операций, передающем в непостоянном словаре параметров действия и другой информации. Действие может принять решение изменить содержание словаря прежде, чем возвратиться из writeToDictionary:. Тогда объединенные словари каждого действия потока операций кодируются и архивируются.

Когда Automator читает архив потока операций из диска или области монтажа, это отправляет a initWithDefinition:fromArchive: обменивайтесь сообщениями к каждому действию в потоке операций. В первом параметре сообщения словарь, из которого действие может воссоздать свое состояние, особенно выбранные в последний раз параметры. Второй параметр говорит недавно создаваемый объект действия, прибывает ли его определение из архива.

Как только все действия в потоках операций были повторно инициализированы от архива, поток операций готов использовать. Пользователи могут выбрать параметры в действиях и выполнить поток операций. Вещи продолжают в этой точке, как описано в Новом Потоке операций.

Программирование импликаций загружаемых пакетов

Когда язык разработки является Objective C, загружаемая архитектура пакета Automator имеет некоторые импликации для программирования действия, особенно. Эти импликации касаются пакетов, разархивирования файла пера и пространств имен.

Доступ пакета

Одна проблема с пакетами является результатом различия между основным пакетом приложения, такого как Automator и пакетами, загружающимися приложением. Если Вы просите основной пакет в коде Вашего действия — например:

NSBundle *theBundle = [NSBundle mainBundle];

Вы получаете основной пакет приложения Automator, не пакет вызова действия mainBundle. Для пакета действия необходимо отправить a bundle обменивайтесь сообщениями к объекту действия (который обычно является self в коде, реализовывая действие):

NSBundle *theBundle = [self bundle];

bundle метод объявляется классом AMBundleAction, который все объекты действия наследовали от, прямо или косвенно (см. Классы Automator).

Разархивирование файла пера

Программы какао часто реализуют awakeFromNib метод (чей дубликат для программ AppleScript Studio awake from nib обработчик команды). awakeFromNib когда все объекты в файле пера программы были разархивированы, метод вызывается. Это дает программе возможность выполнить любую инициализацию, требующую присутствия всех разархивированных объектов.

Однако awakeFromNib когда Automator запускается, метод вызывается в действии. В это время Automator читает в любом двоичном коде действий в стандартных расположениях Automator, и это непосредственно разархивировало объекты в файлах пера, которыми это непосредственно владеет. Однако эти объекты не включают объекты в файлы пера действий. Файл пера действия не загружается, и его объекты не разархивированы, пока пользователи не перетаскивают действие в поток операций. Если Вы хотите выполнить инициализации, требующие присутствия всех объектов и соединений в файле пера действия, реализующие opened метод вместо awakeFromNib.

Пространства имен

Класс Objective C определяет пространство имен для методов и переменных экземпляра, которые он объявляет. Из-за этого тождественно названные методы и переменные экземпляра в других классах не вызывают конфликты в процессе. Однако, имя самого класса существует в пространстве имен, занятом всеми классами, загруженными процессом. Кроме того, все глобальные символы (такие как функции и типы данных) совместно используют то же пространство имен в процессе.

Для Automator, с его загружаемым пакетом (или плагин) архитектура, потенциал для конфликтов пространства имен — и следовательно исключений на этапе выполнения — является значительным. Automator может потенциально загрузить сотни действий из других источников и, например, если два класса действия имеют то же имя или объявляют строковую константу с тем же именем, существует потенциал для конфликта пространства имен, когда те действия загружаются Automator.

Для предотвращения конфликтов пространства имен рекомендуется присвоить префиксы всем классам и глобальным типам, которые являются отличительными как возможные. Например, если именем Вашей компании является Высшая точка, Вы могли бы назвать класс AC_FilterImages.

Поточная обработка архитектуры

Чтобы улучшить устойчивость во время выполнения и предоставить находящийся в AppleScript доступ действий к ресурсам, таким как Стандартные Дополнения, Automator имеет архитектуру поточной обработки, помещающую различные типы действия программы на отдельных потоках. Automator запускает поток операций на вторичном потоке (т.е. потоке кроме основного потока). Но поскольку это циклически повторяется посредством действий потока операций, это выполняет каждое действие с различным потоком в зависимости от того, основывается ли действие на AppleScript или Objective C:

Эта архитектура поточной обработки налагает ограничения на обоих писателей действий Objective C и находящихся в AppleScript. Если находящееся в AppleScript действие использует do shell script команда, пользовательский интерфейс представляется безразличный, пока не завершается сценарий; единственным путем пользователи могут отменить выполнение, должен нажать Command-period. Если действия Objective C к окнам экрана, они должны сделать так на основном потоке с помощью метода такой как performSelectorOnMainThread:withObject:waitUntilDone:.

Классы Automator

Automator как технология включает не только приложение и его действия, но и платформу Automator (Automator.framework). Платформа реализует большую часть общего поведения действий и также обеспечивает открытый интерфейс, определенный четырьмя классами: AMAction, AMBundleAction, AMAppleScriptAction и AMShellScriptAction. Эти классы иерархически связаны (с точки зрения наследования) как показано на рисунке 3.

Рисунок 3  общедоступные классы Automator
The Automator public classes

AMAction является абстрактным классом, указывающим интерфейс и приписывающим важный для всех действий. Главный атрибут действия (как определено AMAction) является своим определением, словарем, полученным из свойств действия, указанных в информационном списке свойств пакета. Определяемый инициализатор AMAction включает определение действия в свою подпись: initWithDefinition:fromArchive: . Главный метод в программируемом интерфейсе действия (как определено AMAction) runWithInput:fromAction:error:, который кратко описан в Загружаемой Архитектуре Пакета.

Класс AMBundleAction непосредственно наследовался от AMAction и обеспечивает конкретную реализацию его. AMBundleAction определяет интерфейсное и общее поведение действий, которые являются загружаемыми пакетами. Объекты AMBundleAction имеют три существенных свойства:

Связанные действия разработаны, чтобы представить представление, получить доступ к ресурсам пакета и получить доступ к параметрам для действия. Реализация класса AMBundleAction позволяет действиям быть скопированной, вставленной и закодированной для архивации. Объекты действия Objective C всегда инстанцируют от пользовательских подклассов AMBundleAction.

AMAppleScriptAction и AMShellScriptAction являются подклассами AMBundleAction. Они расширяют загружаемые пакеты действия так, чтобы сценарии AppleScript или сценарии оболочки могли управлять логикой действия вместо кода Objective C (несмотря на то, что AppleScript, Objective C и даже код сценария оболочки могут быть смешаны в реализации действия). Единственный выход AMAppleScriptAction является объектом OSAScript представление сценария; по умолчанию этот выход установлен в объектное представление main.applescript.

Можно создать собственные подклассы на последних двух уровнях иерархии классов Automator — т.е. AMBundleAction на вниз — для получения объектов с характеристиками и возможностями, в которых Вы нуждаетесь. Если Вы хотите создать загружаемые пакеты действия, поведение которых определяется языками сценариев кроме AppleScript, сценариев оболочки, Perl или Python, Вы разделили бы AMBundleAction на подклассы.

Концептуально, два фундаментальных внешних фактора для действия являются входным объектом, переданным это предыдущим действием (если таковые имеются) и параметры, указанные пользователями посредством средств управления и текстовых полей представления действия. Экземпляр AMBundleAction получает доступ к входному объекту в своей реализации runWithInput:fromAction:error: и получает параметры непосредственно с пользовательского интерфейса на механизм привязки Какао. Для находящегося в AppleScript действия (представленный экземпляром AMAppleScriptAction), входной объект и параметры являются еще более явными. Они происходят как переданный - в значениях в on run обработчик, как показано на рисунке 4.

Рисунок 4  типичный сценарий действия
A typical action scriptA typical action script

Для получения информации это разъясняет аспекты этого кода сценариев, посмотрите Реализацию Действия AppleScript.