有没有办法通过XPC传递任意结构?

时间:2013-06-08 20:05:08

标签: objective-c cocoa xpc nsxpcconnection

我希望我的Cocoa应用程序与数据库服务器通信。遵循app沙盒设计中的原则,将数据库通信拆分为XPC服务是有意义的。

由于XPC服务应该是无状态的,因此包含连接信息的结构(例如a MySQL connection handle)需要由主应用程序保存并根据需要传递到XPC服务。但是句柄是一个opaque类型,XPC服务似乎不支持它 - 只允许基本的算术/逻辑/集合类型。

是否有某种方法可以将连接句柄(或其他不透明类型)设置为可以传递给XPC服务?

1 个答案:

答案 0 :(得分:3)

由于MySQL连接句柄不是无状态的,并且因为首先将网络代码隔离到XPC中的全部意义是稳定性,所以我不担心无状态。它被认为是优选的,但不是必需的。引用:

Because an XPC service can be terminated suddenly at any time, it must be designed
to hold on to minimal state—ideally, your service should be completely stateless,
although this is not always possible.

XPC documentation

这是其中一种并非总是可行的情况。 MySQL连接保持自己的状态,所以如果你想保持无状态,你最好的办法就是每次都将你的所有凭证作为原子操作传递给XPC,这样效率会很低。

相反,我建议您在应用程序和XPC之间来回创建某种“句柄”,可以在XPC内的表中查找以进行验证(如果XPC终止并且再次启动它可以告诉它被中断并发回错误)。然后,在应用程序端,您可以发送该句柄以进行操作,并在必要时通过从XPC重新获取“句柄”来重新打开内部API句柄。这可以直接在您的代码中完成,这会使数据库调用,但如果XPC容易死亡,那么您可能希望将其放入内部库并维护凭据,以便您可以重新启动XPC并重新启动连接而不打扰更高级别的代码。

无论哪种方式,你都希望在SQL事务级别保持对XPC的调用,因为MySQL连接可能会在调用XPC之间中止,这会导致回滚,你必须重新开始。