Цель- c, внедрить службу xp c с ответом - PullRequest
0 голосов
/ 29 января 2020

До сих пор у меня была односторонняя служба xp c, слушатель которой был реализован следующим образом:


@protocol myProtocol
-(void)myFunc:(NSString*)input;
...
@end

@interface myExpotedObject : NSObject <myProtocol>
@end

@interface ServiceDelegate : NSObject <NSXPCListenerDelegate>
@end

@implementation myServiceDelegate

    - (BOOL)listener:(NSXPCListener *)listener 
                   shouldAcceptNewConnection:(NSXPCConnection *)newConnection {

        newConnection.exportedInterface =
            [NSXPCInterface.interfaceWithProtocol:@protocol(myProtocol)];

        newConnection.exportedObject = [myExportedObject sharedInstance];

        [newConnection resume];
        return YES
    }

Теперь я могу sh отправить некоторые данные обратно вызывающей стороне. Итак, я реализовал новый интерфейс ответа с несколькими функциями

Обратите внимание, что если бы мне нужна была только одна функция ответа, я мог бы просто поместить ее в ответ на один блок протокола - но если бы у меня было несколько блоков в одной функции протокола он кричит о следующей ошибке

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: 'NSXPCInterface: Only one reply block is allowed per selector 
(myProtocol / myFunc:withOnResponseCb:withOnErrorCb)'
terminating with uncaught exception of type NSException
@protocol myReplyInterface
    -(void)onResponse:(NSDictionary*)success;
    -(void)onError:(NSError*)error;
@end

, и теперь я хочу сделать методы из исходного интерфейса, получить myReplyinterface, чтобы вернуть правильный ответ с правильными данными.

Итак, я определяю исходный интерфейс таким же образом:

NSXPCInterface *myInterface = 
     [NSXPCInterface.interfaceWithProtocol:@protocol(myProtocol)];`

, затем меняю протокол для поддержки функции ответа

@protocol myProtocol
-(void)myFunc:(NSString*)input withReplyHandler:(id<myReplyProtocol>)handler;
...
@end

, а затем задаю параметры одного из методов исходного интерфейса с интерфейсом ответа.

[myInterface setInterface:[NSXPCInterface interfaceWithProtocol:@protocol(myReplyInterface)] forSelector:@selector(myFunc:withReplyHandler:) argumentIndex:1 ofReply:NO]

Так что теперь все, что мне нужно сделать, это реализовать этот интерфейс на стороне процесса вызывающей стороны.

Возможно, кто-нибудь может сказать мне, если это правильный способ определения ответов на методы xp c?

...