【发布时间】:2018-11-13 17:04:41
【问题描述】:
TL;DR:您如何对MTLSharedTextureHandle 和MTLSharedEventHandler 进行编码和解码,使其可以通过xpc_dictionary 内的XPC 连接传输?
我正在开发的一个 macOS 应用程序广泛使用 XPC 服务,并使用基于 C 的 API 实现。 (即:xpc_main, xpc_connection, xpc_dictionary...)这在当时是有道理的,因为某些对象,如IOSurfaces,不支持NSCoding/NSSecureCoding,必须使用IOSurfaceCreateXPCObject 传递。
在 macOS 10.14 中,Apple 引入了用于在进程之间共享 Metal 纹理和事件的新类:MTLSharedTextureHandle 和 MTLSharedEventHandle。这些类支持NSSecureCoding,但它们似乎在 C-XPC 接口中没有用于编码/解码它们的对应部分。
我想我可以使用[NSKeyedArchiver archivedDataWithRootObject:requiringSecureCoding:error] 之类的东西将它们转换为NSData 对象,然后可以将其存储在xpc_dictionary 中,但是当我尝试这样做时,出现以下异常:
Caught exception during archival:
This object may only be encoded by an NSXPCCoder.
(NSXPCCoder 是一个私有类。)
MTLSharedTextureHandle 和 MTLSharedEventHandle 都会发生这种情况。我可以切换到使用新的NSXPCConnection API,但我已经在 C 接口上构建了大量代码,所以我宁愿不必进行切换。
有没有办法将这两个类中的任何一个归档到一个有效负载中,该有效负载可以存储在xpc_dictionary 中,以便在服务和客户端之间传输?
【问题讨论】:
-
如果您只是尝试将共享句柄对象视为 XPC 对象会发生什么?例如,将其存储在 XPC 字典等中?
-
如果我将 MTLSharedTextureHandle 转换为
xpc_object_t然后调用xpc_dictionary_set_value,它只会在调用xpc_connection_send_message时崩溃。堆栈跟踪以 EXC_BAD_ACCESS(代码=EXC_I386_GPFLT)在_xpc_dictionary_serialize_apply结束。
标签: objective-c macos metal xpc nsxpcconnection