2

我已经阅读了 NSXPC* 文档,该文档建议使出售的服务尽可能无状态。这是一个好主意,至少对于我读过的文档和示例而言,因为服务和调用应用程序将彼此视为单例,并且一次只运行一个服务实例。这意味着这些方法本质上是非成员函数(使用 C++ 术语)。

我为什么要解决这个问题?我想将网络代码放入 XPC。由于 XPC 将使用具有多个窗口的 GUI 应用程序,因此我需要支持多个同时连接。这不适用于单身人士,至少直接如此。

网络 API 是基于 C 的,主要状态类型是指向自定义struct. 那么我们为什么不做类似的事情:

  1. 让创建函数返回一个值类型,比如NSUUID什么。(跨进程传递指针是个坏主意。)
  2. 在服务中,在 API C 指针和 API C 指针之间创建NSDictionarystd::map或其他)映射。NSUUID
  3. 各种服务 API 获取UUID并将其转换为 C 指针以使用网络 API。

另外:由于token是随机的,如果XPC服务崩溃,XPC重启后主应用会有一个无用的token。也许我应该使用一个 URL(它将包含所有重新启动的信息)。但是,如果两个连接碰巧在同一台服务器上,我们就会遇到潜在的冲突。也许我可以将这些想法与作为 URL/UUID 对的令牌结合起来。(UUID 值将从服务返回变为由主应用程序提供。)

这是实现全状态 XPC 的好方法吗?

4

1 回答 1

0

您可能希望向服务接口添加一个方法,该方法使用长期存在的代理对象进行回复。您可以通过调用 来安排发生这种情况-[NSXPCInterface setInterface:forSelector:argumentIndex:ofReply:],将 YES 传递给最后一个参数。详细信息可在此处获得:

https://developer.apple.com/library/mac/documentation/Foundation/Reference/NSXPCInterface_reference/#//apple_ref/occ/instm/NSXPCInterface/setInterface:forSelector:argumentIndex:ofReply

于 2016-09-10T07:05:08.497 回答