我希望我的Cocoa应用程序可以与数据库服务器通信。遵循应用程序沙箱设计中的原理,将DB通信拆分为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并重新初始化XPC。连接而无需打扰更高级别的代码。

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

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

10-12 14:20