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

Posted

技术标签:

【中文标题】有没有办法通过 XPC 传递任意结构?【英文标题】:Is there a way to pass arbitrary struct via XPC? 【发布时间】:2013-06-08 20:05:08 【问题描述】:

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

由于 XPC 服务应该是无状态的,因此包含连接信息的结构(例如 mysql connection handle)需要由主应用程序持有并根据需要传递给 XPC 服务。然而,句柄是一种不透明的类型,XPC 服务似乎不支持 - 只允许基本的算术/逻辑/集合类型。

有没有办法将连接句柄(或其他不透明类型)装箱,以便将其传递给 XPC 服务?

【问题讨论】:

“不要尝试复制MYSQL [连接句柄] 结构。不能保证这样的副本是可用的。” 【参考方案1】:

由于 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 的调用之间中止,这会导致回滚,您必须重新开始。

【讨论】:

以上是关于有没有办法通过 XPC 传递任意结构?的主要内容,如果未能解决你的问题,请参考以下文章

XPC 没有为 XPC 服务创建任何进程

通过 XPC 或 MACH 在 OSX 上启动服务

在 XPC 服务守护进程中查看可用的字典?

非常简单的 macOS XPC

通过 IPC 跨进程传递对 COM 对象的引用?

XPC 服务阵列崩溃