Сценарии информации о версии моста
Этот документ касается новой и обновленной информации для Сценариев Моста. Концептуальная и справочная информация раньше в этом документе была перемещена в Сценарии Руководства по программированию Моста.
Содержание:
10.6 Изменения
Обработка ошибок
Методы экземпляра в Сценариях Моста отправляют события Apple в целевое приложение, которое может перестать работать для множества различных причин, многих из них не обнаруживаемый заранее. В предыдущих версиях, Пишущий сценарий Моста обработал отказавшие события путем вызова метода делегата eventDidFail:withError:, реализация по умолчанию которого выдала исключение. Это отразило использование AppleScript, но в Какао, исключения резервируются для программных ошибок, не ошибок периода выполнения. Поэтому OS X v10.6 изменяет протокол обработки ошибок. Когда событие перестало работать, NSError объект будет присоединен к экземпляру SBObject, отправившему событие, которое можно получить использование нового -lastError метод:
@interface SBObject (ErrorHandling10_6) |
- (NSError *) lastError; |
@end |
Если программа установит объект делегата, то ее вызовут после установки lastError, и инициирующий метод возвратится nil или 0 в зависимости от его типа возврата.
Поскольку ошибка только присоединена к экземпляру, отправившему событие, объединенные в цепочку выражения должны будут быть переписаны, если Вы захотите сообщить об ошибках. Рассмотрите попытка получить имя текущей дорожки в iTunes, который перестанет работать, если не будет никакой текущей дорожки. Вы могли записать это наивно, игнорируя ошибку:
iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"]; |
name = [[iTunes currentTrack] name]; |
if (name) NSLog(@"current track is %@", name); |
Это работает, потому что name возвратится nil при отказе, но ошибке был эффективно потерян, потому что это было присоединено к временному объекту, возвращенному [iTunes currentTrack]. Для достигания ошибки необходимо было бы переписать код немного для содержания ссылки на промежуточный SBObject, показанный сюда использование track:
iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"]; |
track = [iTunes currentTrack]; |
name = [track name]; |
if (name) |
NSLog(@"current track is %@", name); |
else { |
NSError *error = [track lastError]; |
NSLog(@"couldn't get current track because %@", [error localizedDescription]); |
} |
Обработка предиката
-[SBElementArray filteredArrayUsingPredicate:] непосредственно не поддерживает все NSPredicate может сделать, потому что это должно превратить предикат в событие Apple, имеющее меньше функций. В предыдущих версиях, если это получило предикат, который не мог бы быть представлен как событие Apple, оно отступит к -[NSArray filteredArrayUsingPredicate:]. Однако это дало противоречивые результаты: в зависимости от предиката это могло бы возвратить любого NSArray или SBElementArray, и производительность могла дико отличаться.
В v10.6, -[SBElementArray filteredArrayUsingPredicate:] приведет к сбою за исключением, если дали предикат, который оно не может обработать. Если Вы не можете переписать предикат без неподдерживаемых битов, можно эмулировать старое поведение при помощи -get получить NSArray, и затем использовать -filteredArrayUsingPredicate: на этом:
filtered = [[SomeApp someObjects] get] filteredArrayUsingPredicate:complexPredicate]; |
Для лучшей производительности выделите части это SBElementArray может обработать в другой предикат и фильтр, что сначала, таким образом, второй предикат должен будет исследовать меньше объектов:
firstPass = [[[SomeApp someObjects] filteredArrayUsingPredicate:simpleBits] get]; |
filtered = [firstPass filteredArrayUsingPredicate:complexBits]; |
Для совместимости приложения, соединенные на OS X v10.5, все еще получат старое поведение. Для Моста Сценариев использования сценариев через мост Objective C, такой как PyObjC или RubyCocoa, соответствующее «приложение» является интерпретатором. Если интерпретатор был основан на OS X v10.6, как python(1) и ruby(1) тогда сценарий получает новое поведение.
Исправления ошибок и улучшения
NSDictionary-AERecord перевод теперь обрабатывает определяемые пользователем ключи (в противоположность ключам, определенным интерфейсом сценариев приложения). [5525649]
-[SBElementArray addObject:] теперь работы лучше с приложениями некакао. [5585347]
Были фиксированы много утечек памяти. [5856221]
Сценарии Моста больше не распечатывают предупреждения об уродливых интерфейсах сценариев при создании SBApplication объект. [5964420]
sdp(1) улучшил сообщения об ошибках и отмечает предупреждающие сообщения как предупреждения. [5649633]
10.5.6 Изменения
Специализированные методы тот возврат BOOL теперь работайте правильно над системами PowerPC. [5525649]
Потокобезопасность
Используя многократные потоки со Сценариями Моста может дать воспринятые или фактические преимущества производительности. В частности удаленное приложение может требовать времени для ответа на сообщение, и приложение должно остаться быстро реагирующим к вводу данных пользователем, в то время как это ожидает. Сценарии Моста могут использоваться с многократными потоками учитывая несколько инструкций.
SBObject может выполнить работу на любом потоке.
SBObject может быть вызван на любой поток, основной или фон. События Apple, отправленные от SBObject, устанавливаются с портом на поток, таким образом, события Apple на различных потоках не блокируют друг друга.
SBObject должен выполнить работу только на одном потоке за один раз.
Любой единственный экземпляр SBObject, включая экземпляр SBApplication, должен использоваться от самое большее одного потока за один раз. Если Вы хотите совместно использовать единственный экземпляр между потоками, необходимо установить эксклюзивный доступ с помощью блокировок. Два экземпляров объектов, относящиеся к тому же объекту удаленного приложения, такому как определенный документ в TextEdit, все еще считают отличными в целях распараллелить, но видят ниже.
Целевое приложение может не быть многопоточным.
Просто, потому что Ваше приложение многопоточно, не означает, что целевое приложение. В целом предположите, что целевое приложение может обработать только одно сообщение за один раз. Кроме того, пытаться управлять тем же удаленным объектом, таким как определенный документ, больше чем от одного потока сразу подвергается типичным проблемам состязательного и состояния состязания. Ваше приложение ответственно за то, что сделало любую применимую блокировку.
Эта информация применяется ко всем версиям Сценариев Моста.
Copyright © 2015 Apple Inc Все права защищены. Условия использования | Политика конфиденциальности | обновленный: 27.05.2009