Превратить идентификатор обратно в ссылочный объект в AppScript target-c - PullRequest
0 голосов
/ 22 января 2011

Я пишу приложение, которое общается с Mail, используя Objective-C-appscript (objc-appscript).Я хочу сделать копию выбранных в данный момент почтовых сообщений и выполнить некоторую обработку позже - в это время текущий выбор может измениться.MLReference *.Я уверен, что это должна быть простая операция, но я новичок в appscript и нуждаюсь в некотором руководстве.Спасибо!

Ответы [ 2 ]

0 голосов
/ 22 января 2011

Вы предполагаете, что в событии Apple IPC используются прокси-объекты, такие как распределенные объекты, но это не так: это RPC + запросы.(Думайте XPath над XML-RPC как грубая аналогия.) Это распространенное заблуждение - сами Apple совершенно не в состоянии объяснить это, но понимание сути событий Apple, основанных на запросах, крайне важно для эффективного управления приложениями с поддержкой сценариев.

В любом случае, здесь вы ошибаетесь:

id theSelection = [[ref getItem] copy];

Эта строка копирует объект MLReference, идентифицирующий свойство selection Mail, но в качестве ссылки в основном аналогичен URL-адресу, который эффективноa no-op.

MLMoveCommand *cmd = [[theSelection move] to: [[mail mailboxes] byName:@"test"]];

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

Правильным решением в этом случае является использование команды get для получения списка ссылок (в данном случае NSArray экземпляров MLReference), который вы можете позже перебрать, чтобы переместить каждый из ссылочных объектов.сообщения по очереди.К счастью, ссылки, которые возвращает Mail, идентифицируют сообщения по идентификатору, что означает, что они должны продолжать указывать на исходные объекты сообщения, даже если они тем временем перемещаются.(Ссылки по индексам и по именам гораздо менее стабильны, поэтому вам нужно быть более осторожным при работе с приложениями, которые их используют.)

Например (проверка ошибок для ясности опущена):

MLApplication *mail = [MLApplication applicationWithBundleID: @"com.apple.mail"];
NSArray *messageRefs = [[mail selection] getItem];
// do other stuff here
MLReference *message;
for (message in messageRefs) {
    MLMoveCommand *cmd = [[mail move: message] to: [[mail mailboxes] byName: @"test"]];
    id result = [cmd send];
}

См. Руководство к приложению для получения дополнительной информации.Также, ASTranslate - ваш друг.

0 голосов
/ 22 января 2011

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

Например,

NSString *something = [(MLReference *)theSelection someFuncIMadeUp];

Вы можете прочитать все о среде выполнения (например, метод класса) в Apple Doc:

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html

...