I need to use something like this fairly regularly within my Mac and iOS applications, so I use the following helper function (originally described in this answer):
void runOnMainQueueWithoutDeadlocking(void (^block)(void))
{
if ([NSThread isMainThread])
{
block();
}
else
{
dispatch_sync(dispatch_get_main_queue(), block);
}
}
which you call via
runOnMainQueueWithoutDeadlocking(^{
//Do stuff
});
This is pretty much the process you describe above, and I’ve talked to several other developers who have independently crafted something like this for themselves.
I used [NSThread isMainThread]
instead of checking dispatch_get_current_queue()
, because the caveats section for that function once warned against using this for identity testing and the call was deprecated in iOS 6.