Вы предполагаете, что в событии 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 - ваш друг.