objective-c - NSTask:由于没有提供 userInfo 字典,如何在结论时获取上下文?

标签 objective-c cocoa nstask

我正在尝试通过 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/

相关文章:

ios - 循环在第一次被调用时只运行一次,第二次无限次

iphone - 我想在IOS中画一个类似矩形的形状,带有可拖动的角

objective-c - 发送通知到山狮通知中心

iphone - 使用 Cocos2d 自动 Sprite 动画

xcode - 在 cocoa 应用程序中以 int 形式检索垃圾箱大小

objective-c - 如何在一致的环境中循环使用 NSTask 运行终端命令?

objective-c - performSelector 方法有什么作用?

iphone - 如何从 XML 模式生成 Objective C 类文件?

cocoa - 确定终止的子进程未捕获哪个信号

ios - 为已经构建的应用程序实现状态恢复