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

标签 objective-c cocoa xpc nsxpcconnection

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

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

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

最佳答案

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

关于objective-c - 有没有办法通过 XPC 传递任意结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17003358/

相关文章:

objective-c - 在 finder 同步扩展和 XPC 之间通信

objective-c - 懒惰的图像绘制

java - 从 Java 学习 iPhone 编程的最佳方法是什么?

cocoa - 本地化编辑菜单和其他标准菜单

objective-c - 应该如何编写带有状态的 XPC 服务?

swift - CoreBluetooth XPC 连接无效

iphone - 在应用程序版本等之间访问 CoreData 实体

objective-c - 如何将UINavigationBar后退按钮的标题更改为 "Back"

ios - 将 CAShapeLayer 添加为不可见的子层

ios - 对 NSDictionary 进行降序排序。如何使用 `compare:options:` 选择器发送选项?