在iOS上有一种方法可以使某个单独对象上的所有操作都发生在自己的专用线程中吗?

时间:2012-04-12 03:35:54

标签: ios multithreading objective-c-blocks nsthread pjsip

我正在iOS上构建VoIP手机应用程序(使用PJSIP库),PJSIP要求您注册访问它的线程并管理其配置,以确保线程安全。这意味着处理或管理对该库的调用无法由GCD处理,并且需要位于主线程上(如果存在问题,它将阻塞并且UI将不会绘制的可怕解决方案),或者创建自己的专用线程

我已经在我的app委托中创建了自己的专用线程和runloop,并在其上执行了一些选择器,但它很麻烦。我想将当前会话的所有调用封装到我在启动时创建的单个对象中,并且所有这些调用都在它们自己的线程中进行。

Apple的文档有点稀疏,所以我想弄清楚是否有更智能的方法来管理这个PJSIP实例上的注册线程。天啊,可能有一些我甚至都没有想过的东西。

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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