До сих пор у меня была односторонняя служба 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?