gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:33:06 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com