Question

I'm building a VoIP handset application on iOS (using the PJSIP library), and PJSIP requires you to register the thread that accesses it and manages its configuration, for thread safe purposes. This means handling or managing calls to that library can't be handled by GCD and need to either be on the main thread (terrible solution as it will block and the UI will not draw if there are issues), or create your own dedicated thread.

I've created my own dedicated thread and runloop in my app delegate and perform some selectors on it, but it's messy. I want to encapsulate all of the calls to the current session into a singleton object that I create at launch and have all of those calls occur in their own thread.

Apple's documentation is a bit sparse so I'm trying to figure out if there is a more intelligent way to manage the registered thread on this PJSIP instance. Hell, there may be something I haven't even thought of.

I know it's more of a technical question, but I'd be interested to see what ideas people come up with.

I've already built a category on top of NSThread that allows me to perform blocks on that particular thread but it's an ugly ugly hack.

Was it helpful?

Solution

I can think of a few solutions for this. If there are only ever going to be a limited number of methods you could create a static wrapper for each one that gets the singleton instance and then executes the method on the single thread. You could choose per method if you want it to block the calling thread or not.

Another option that comes to mind, that is more elegant and scales better, is to use an event system. You can define an event for each of your methods and if a function wants to execute a method, it would trigger the event. If you need data to be returned from an event you can have the caller register for an event signifying that the method has been completed.

The final solution that comes to mind would be to create a proxy object that will respond to any message using the forwardInvocation: method and call the selector on the real singleton instance on a single thread. (look at Apple's documentation for more information: Forwarding). This is the most complex but probably the most elegant in the end. This would allow for the addition of new function in the future without having to do any extra wrapping.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top