我正在iOS上构建VoIP手机应用程序(使用PJSIP库),PJSIP要求您注册访问它的线程并管理其配置,以确保线程安全。这意味着处理或管理对该库的调用无法由GCD处理,并且需要位于主线程上(如果存在问题,它将阻塞并且UI将不会绘制的可怕解决方案),或者创建自己的专用线程
我已经在我的app委托中创建了自己的专用线程和runloop,并在其上执行了一些选择器,但它很麻烦。我想将当前会话的所有调用封装到我在启动时创建的单个对象中,并且所有这些调用都在它们自己的线程中进行。
Apple的文档有点稀疏,所以我想弄清楚是否有更智能的方法来管理这个PJSIP实例上的注册线程。天啊,可能有一些我甚至都没有想过的东西。
我知道这更像是一个技术问题,但我有兴趣看看人们提出了什么想法。
我已经在NSThread之上构建了一个类别,允许我在该特定线程上执行块,但这是一个丑陋丑陋的黑客。
答案 0 :(得分:2)
我可以想到一些解决方案。如果只有有限数量的方法,你可以为获取单例实例的每个方法创建一个静态包装器,然后在单个线程上执行该方法。如果您希望它阻止调用线程,您可以选择每种方法。
想到的另一个选择是更优雅,更好地扩展,是使用事件系统。您可以为每个方法定义一个事件,如果一个函数想要执行一个方法,它将触发该事件。如果您需要从事件返回数据,您可以让调用者注册表示该方法已完成的事件。
我想到的最终解决方案是创建一个代理对象,它将使用forwardInvocation:方法响应任何消息,并在单个线程上调用真实单例实例上的选择器。 (有关更多信息,请查看Apple的文档:Forwarding)。这是最复杂的,但最终可能是最优雅的。这将允许将来添加新功能,而无需进行任何额外的包装。