我正在尝试通过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;您不能控制进程ID。底层操作系统。


使用任务对象的地址似乎是最好的解决方案:

[taskInfoDict setObject:userInfo forKey:[NSValue valueWithPointer:task]]


假设有一个引用计数的环境,任务对象的地址将在其生存期内保持稳定,并且其生存期完全由您的应用程序控制。在此解决方案中,复制垃圾收集器会很费力,但是在这种情况下,您可以使用可以直接处理指针的收集类(NSMapTable)。

关于objective-c - NSTask:由于没有提供userInfo词典,如何在得出结论时获得上下文?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6299408/

10-13 08:27