我正在使用一个用C ++构建的独立音频引擎编写iOS应用程序。我们的想法是尽可能多地使用Swift编写应用程序,将音频引擎作为单独的线程或进程运行,然后让用户界面触发与音频引擎的通信。
如何最好地实现这一目标?
我的第一个尝试是添加一个处理触发相应C ++代码的中间Objective-C ++类(TestEngine)。这个Objective-C ++类我在Swift中这样启动:
// Initialize audio engine
let engine = TestEngine()
// Start engine in a new thread
NSThread.detachNewThreadSelector(NSSelectorFromString("startEngine"), toTarget: engine, withObject: nil)
TestEngine类如下所示:
@implementation TestEngine
- (void) startEngine {
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(selectorMethod)
name:@"testSelector"
object:nil];
NSLog(@"StartEngine done on thread:%@", [NSThread currentThread]);
}
- (void) selectorMethod {
NSLog(@"This is selector, on thread %@", [NSThread currentThread]);
}
- (void)dealloc
{
NSLog(@"Now deallocing");
}
@end
现在的问题是,在能够接收任何通知之前,该对象立即被释放。我也尝试过查看RunLoops,但是找不到任何简单(不是太低级别)的方法来向RunLoop添加观察者。关于如何在iOS上最好地设计这样的解决方案的任何想法?
答案 0 :(得分:1)
我想这里有你的答案
引用Apple文档
常规通知中心在线程中发送通知 通知已发布。分布式通知中心 在主线程上发送通知。有时,您可能需要 要在特定线程上传递的通知 由您而不是通知中心确定。例如,如果 在后台线程中运行的对象正在侦听 来自用户界面的通知,例如窗口关闭,您 想在后台线程中收到通知 而不是主线程。在这些情况下,你必须抓住 通知,因为它们是在默认线程和重定向上传递的 他们到适当的线程。