swift - Swift:调用 AppleScript 获取邮件选择很慢
问题描述
我正在使用以下 Swift 执行 AppleScript 以捕获 Apple Mail 中当前选定的消息。
func getMessage(messageID: String) -> String?
{
if let url = Bundle.main.url(forResource: "getMessages", withExtension: "scpt") //need to add it to the build phases
{
var appleScriptError: NSDictionary? = nil
guard let script = NSAppleScript(contentsOf: url, error: &appleScriptError) else
{
return nil
}
let message = NSAppleEventDescriptor(string: messageID)
let parameters = NSAppleEventDescriptor(listDescriptor: ())
parameters.insert(message, at: 1)
var psn = ProcessSerialNumber(highLongOfPSN: UInt32(0), lowLongOfPSN: UInt32(kCurrentProcess))
let target = NSAppleEventDescriptor(descriptorType: typeProcessSerialNumber, bytes: &psn, length: MemoryLayout<ProcessSerialNumber>.size)
let handler = NSAppleEventDescriptor(string: "getMessages")
let event = NSAppleEventDescriptor.appleEvent(withEventClass: AEEventClass(kASAppleScriptSuite), eventID: AEEventID(kASSubroutineEvent), targetDescriptor: target, returnID: AEReturnID(kAutoGenerateReturnID), transactionID: AETransactionID(kAnyTransactionID))
event.setParam(handler, forKeyword: AEKeyword(keyASSubroutineName))
event.setParam(parameters, forKeyword: AEKeyword(keyDirectObject))
var executeError: NSDictionary? = nil
let result = script.executeAppleEvent(event, error: &executeError)
if let executeError = executeError
{
print("ERROR: \(executeError)")
return nil
}
else
{
return (result.stringValue ?? "")
}
}
return nil
}
它调用这个 AppleScript:
on getMessages(messageID)
tell application "Mail"
my dlog("Start getMessages")
set theSelection to selection
my dlog("Got the selection")
set returnString to ""
repeat with theMessage in selection
set messageUUID to message id of theMessage
my dlog("Message " & messageUUID)
set messageSender to my getMessageSenderName(sender of theMessage)
set messageBody to my getMessageBody(content of theMessage)
set messageDate to my ISODate(date received of theMessage)
my saveMessage(theMessage, mailPath)
end repeat
my dlog("End getMessages")
return returnString
end tell
return "-"
end getMessages
on dlog(message)
do shell script "logger -t 'AS DEBUG' getMessage: " & message
end dlog
我遇到的问题是对选择命令的任何调用都需要永远执行。
从控制台:
10:49:39.036005+0100 getMessage: 开始 getMessages 10:50:03.618299+0100 getMessage: 得到选择 10:50:03.648670+0100 getMessage: Message 3c7f13fb334e41e21cf231212c77f199@www.domain.com 10:50:03.648670+0100 7
在此示例中,执行需要 24 秒。AppleScript 的其余部分非常快。我如何重组我的代码并不重要,任何对选择的调用都会花费这么多时间。随后的选择调用也很快。
如果我直接从 AppleScript 执行相同的命令,它也非常快。
我做错了什么还是发生了其他事情?
解决方案
推荐阅读
- json - 遍历 JSON 并创建 React 组件
- python - What does append(self) mean in Python classes?
- php - 如何在 Symfony 4 中正确调用带有实例的函数
- vba - 根据表格vba中的字体颜色隐藏列
- csv - Univocity bean 处理器在分布式系统中表现出不一致的行为
- javascript - KeystoneJS:如何过滤关系,基于另一个关系?
- python - gensim 函数预测输出单词
- c# - 在c#Webapi中将具有字符串列表的类对象序列化为XML
- vba - Excel - 从其他单元格调用函数
- javascript - 保存对象列表返回无法反序列化错误