我正在尝试通过 NSTask 使用命令行实用程序来压缩文件。
伪代码:
controller:
init:
register_self_as_observer_of_nstask_notifications
startZip(file):
file = somefileobject
task = "zip" with file path as argument
task.launch
notification_listener(notification):
task = notification.get_object
file = task.???
那么我如何找出通知属于哪个文件对象呢?我通常使用 userInfo 字典来做这样的事情,但 NSTask 没有这样的选项。 来自Apple Dev :此通知不包含 userInfo 字典。
谢谢!
最佳答案
使用关联对象 API 将用户信息字典附加到任务实例。这将是最干净的方法,但在 Mac OS X 10.6 引入关联对象 API 之前不能使用它。
或者,您可以使用从任务映射到用户信息的字典。创建从任务到用户信息的字典映射并不像听起来那么简单:
- 您不能只是
[taskInfoDict setObject:userInfo forKey:task]
因为NSTask
不符合NSCopying
,但是NSDictionary
依赖于复制其键。 - 使用封装为
NSNumber
的进程标识符作为任务对象的代理通常是有效的。但进程 ID 可以重复使用,并且任务在启动后才会获得 PID。问题的根源是:你不控制进程ID;底层操作系统会这样做。
使用任务对象的地址似乎是最好的解决方案:
[taskInfoDict setObject:userInfo forKey:[NSValue valueWithPointer:task]]
假设引用计数环境,任务对象的地址在其生命周期内将保持稳定,并且其生命周期完全由您的应用程序控制。复制垃圾收集器会在此解决方案中带来麻烦,但在这种情况下,您可以使用可以直接处理指针的集合类 (NSMapTable
)。
关于objective-c - NSTask:由于没有提供 userInfo 字典,如何在结论时获取上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6299408/