Я нашел более простой способ сделать это, используя объект NSConnection. Я создал очень простой объект ExitListener с таким заголовком:
@interface ExitListener : NSObject {
BOOL _exitRequested;
NSConnection *_connection;
}
@property (nonatomic, assign) BOOL exitRequested;
- (void)requestExit;
@end
и эта реализация:
@implementation ExitListener
@synthesize exitRequested = _exitRequested;
// On init we set ourselves up to listen for an exit
- (id)init {
if ((self = [super init]) != nil) {
_connection = [[NSConnection alloc] init];
[_connection setRootObject:self];
[_connection registerName:@"com.blahblah.exitport"];
}
return self;
}
- (void)dealloc {
[_connection release];
[super dealloc];
}
- (void)requestExit {
[self setExitRequested:YES];
}
@end
Чтобы настроить прослушиватель, фоновый процесс просто выделяет и запускает экземпляр ExitListener. Затем настольное приложение запрашивает выход из фонового процесса, выполнив этот вызов:
- (void)stopBackgroundProcess {
// Get a connection to the background process and ask it to exit
NSConnection *connection = [NSConnection connectionWithRegisteredName:@"com.blahblah.exitport" host:nil];
NSProxy *proxy = [connection rootProxy];
if ([proxy respondsToSelector:@selector(requestExit)]) {
[proxy performSelector:@selector(requestExit)];
}
}
Использование NSMachPorts напрямую, казалось, привело к гораздо большим проблемам при регистрации и получении ссылок. Я обнаружил, что NSConnection - это самый простой способ создать базовый канал связи для ситуации, которую мне нужно было решить.