1

我正在 iOS 上构建一个 VoIP 手机应用程序(使用 PJSIP 库),PJSIP 要求您注册访问它并管理其配置的线程,以实现线程安全。这意味着处理或管理对该库的调用不能由 GCD 处理,并且需要在主线程上(糟糕的解决方案,因为它会阻塞并且如果出现问题 UI 将不会绘制),或者创建自己的专用线程.

我在我的应用程序委托中创建了自己的专用线程和运行循环,并在其上执行了一些选择器,但它很混乱。我想将对当前会话的所有调用封装到我在启动时创建的单例对象中,并让所有这些调用发生在它们自己的线程中。

Apple 的文档有点稀疏,所以我试图弄清楚是否有更智能的方法来管理此 PJSIP 实例上的注册线程。见鬼,可能有一些我什至没有想到的事情。

我知道这更像是一个技术问题,但我很想看看人们提出了什么想法。

我已经在 NSThread 之上构建了一个类别,允许我在该特定线程上执行块,但这是一个丑陋丑陋的 hack。

4

1 回答 1

2

我可以为此想到一些解决方案。如果只有有限数量的方法,您可以为每个获取单例实例的方法创建一个静态包装器,然后在单线程上执行该方法。如果您希望它阻止调用线程,您可以选择每个方法。

我想到的另一个更优雅且可扩展性更好的选择是使用事件系统。您可以为每个方法定义一个事件,如果一个函数想要执行一个方法,它将触发该事件。如果您需要从事件中返回数据,您可以让调用者注册一个表明该方法已完成的事件。

想到的最终解决方案是创建一个代理对象,该对象将使用 forwardInvocation: 方法响应任何消息,并在单个线程上调用真正的单例实例上的选择器。(查看 Apple 的文档以获取更多信息:转发)。这是最复杂的,但最终可能是最优雅的。这将允许在将来添加新功能,而无需进行任何额外的包装。

于 2012-04-12T04:17:50.103 回答