我使用XPC将一个项目划分为两个项目--一个主项目(为os x@64位构建)和一个为os x@ 32位构建的XPC服务,因为它使用的是一个32位不可用且无法替换的库。两人使用NSXPCConnection进行通信。
对于从服务到主应用程序的回调,我有一个问题:
当应答接受一个复杂的参数(即,作为nsimage或nsdata的类)时,它不是从xpc服务中调用回来的吗?没有错误或异常,只是什么都没有发生。这种情况有时也发生在另一种情况下,即在调用代理对象时。它不是随机发生的,它只发生在某些回复签名上,虽然我不确定哪一个。
我需要在xpc服务和主应用程序之间以某种方式传递一个nsimage。我试图同时传递NSImage和NSData,但是没有调用答复(值得一提的是,当传递零而不是真正的对象时,它就被调用了)。
我尝试使用NSData字节发送一个指针,然后使用NSData initWithData:length:重新创建数据。当我尝试这样做时,就会调用回复,但是当我调用initWithData时会得到一个initWithData。我想这是因为32位和64位地址之间有些混乱。
几个代码示例:
当回答被采纳时:
输出接口
- (void)getImageWithReply:(void (^)(NSImage *image))reply;回复从呼叫
- (void)getImageReply:(void (^)(NSImage *image))reply
{
//We always re-render. The responsibility to not re-render when not needed will be passed on.
[self render]; //updates puts in local var mRenderBuffer the render data
reply(nil, NO);
NSImage *image = ... //init image. it is being inited correctly, i know that
reply(image);
}'当回复接受数据的ptr时:
输出接口
typedef long long XPC_PTR; //As void* has different sizes in 32/64bit env.
- (void)getRenderBufferWithReply:(void (^)(XPC_PTR ptr, uint size))reply;回复从:调用
- (void)getRenderBufferWithReply:(void (^)(READER_PTR ptr, uint size))reply
{
[self render];
reply((XPC_PTR)[mRenderBuffer bytes], mRenderWidth * mRenderHeight * BYTES_PER_PIXEL, YES);
}发布于 2014-06-19 16:23:24
看来,通过连接传递的所有对象都必须符合NSSecureCoding协议,而NSImage不符合该协议。
NSData确实符合这个协议,现在我正在通过连接传递它(不知道为什么在我之前尝试NSData时它没有工作)。我正在使用发送的数据在主进程中创建NSImage。
发送指针的尝试事后看来是愚蠢的尝试,因为服务和主应用程序自然运行不同的进程,因此它们被映射到不同的物理内存空间。
发布于 2015-04-16 18:51:10
NSImage确实符合NSSecureCoding协议。
@interface NSImage : NSObject
所以不知道你想说什么?
https://stackoverflow.com/questions/24309189
复制相似问题