如何用状态编写XPC服务?

时间:2014-06-25 08:44:37

标签: objective-c cocoa xpc nsxpcconnection

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

为什么我想绕过这个?我想将网络代码放入XPC中。由于XPC将使用GUI应用程序,它将具有多个窗口,我需要支持多个同时连接。这对单身人士不起作用,至少是直接的。

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

  1. 让创建函数返回值类型,例如NSUUID或其他内容。 (在进程中传递指针将是一个坏主意。)
  2. 在服务中,在NSDictionary和API C指针之间创建std::map(或NSUUID或其他)映射。
  3. 各种服务API使用UUID并将其转换为C指针以使用网络API。
  4. 旁白:由于令牌是随机的,如果XPC服务崩溃,主应用程序将有一个在重新启动XPC后无用的令牌。也许我应该使用URL(这将重新启动所有信息)。但是如果两个连接碰巧发生在同一个服务器上,那么我们就会遇到潜在的冲突也许我可以将这些想法与作为URL / UUID对的令牌结合起来。 (UUID值将从服务返回到主应用程序提供。)

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

1 个答案:

答案 0 :(得分: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