我正在开发 Cocoa / Objective C++ 实用程序应用程序,并且想要处理多个(瞬时)文件打开。为了处理文件打开部分,我在我的AppDelegate.mm
file:
- (BOOL)application:(NSApplication*)app openFile:(NSString *)filename
{
NSLog(@"Opening file %@", filename);
// more C++ code here
return YES;
}
这些文件正在发送到 Quicksilver,我相信 Quicksilver 会将文件一个接一个地发送到应用程序(我认为 Finder 的“打开方式”会一次发送所有文件 - 因此可能使用handleOpenApplicationEvent:(NSAppleEventDescriptor *)event
可能会更好) - 但无论如何,应用程序将一个接一个地接收多个文件 - 几乎是瞬时的 - 但不完全一起。这是 Console.app 显示的内容:
console-screenshot.png http://img109.imageshack.us/img109/1205/consolescreenshot.png http://img109.imageshack.us/img109/1205/consolescreenshot.png
由于文件是单独发送的,但是一个接一个地发送,我的问题是如何收集所有发送的文件并用它们做一件事?例如,我想收集发送的所有文件路径,然后将它们一起显示在对话框中。
我可以想到一个可能有效的概念:在接收到每个文件路径时将其存储在数组中。同时,当收到第一个时,在后台设置 1-2 秒的延迟,然后有一个对话框显示特定变量的所有内容。这个概念正确吗?或者有更好的方法吗?我是 Cocoa / Objective C++ 的新手 - 来自 PHP / Perl、bash 等语言。
我还想让这个辅助应用程序在完成后终止,但如果我正在等待文件,如何在收到最后一个文件时终止该应用程序?
如果我添加[NSApp terminate:nil];
to the applicationDidFinishLaunching
函数应用程序实际上在仅收到第一个文件后终止。
更新 - 更多注释
这是使用后的控制台openFiles
(复数)功能:图片7.png http://img24.imageshack.us/img24/5715/picture7zc.png http://img24.imageshack.us/img24/5715/picture7zc.png
使用 Quicksilver,我抓取一些文件,例如临时目录中的文件,然后选择“打开方式”,然后选择我正在创建的应用程序(名为 darn.app)
屏幕截图 2012-01-18 7.02.45 PM.png http://img9.imageshack.us/img9/4171/screenshot20120118at702.png http://img9.imageshack.us/img9/4171/screenshot20120118at702.png
但使用 Finder 似乎效果很好:
屏幕截图 2012-01-18 7.09.08 PM.png http://img832.imageshack.us/img832/8858/screenshot20120118at709.png http://img832.imageshack.us/img832/8858/screenshot20120118at709.png
...consolea.app 中的结果:
图片8.png http://img24.imageshack.us/img24/2812/picture8fe.png http://img24.imageshack.us/img24/2812/picture8fe.png
我确实询问了 Quicksilver 开发人员,他们确认 QS 确实通过“打开方式”操作一次打开一个文件,他们承认这与 Finder 的做法不同,但他们认为这是预期的。所以也许达伦是对的 - 计时器可能是最好的方法......