Assume you have a variable that’s a C function pointer, and that function may directly or indirectly invoke some GUI code:
typedef void (*MyFunc)(void); MyFunc func = ...
In a threaded environment, it would be unsafe to execute this function from a background thread. Objective-C’s NSObject has a selector performSelectorOnMainThread that we can take advantage of, even though our C function isn’t a selector. Simply create a wrapper object:
@interface TestObject : NSObject { MyFunc func; } @property MyFunc func; - (void)invoke; @end @implementation TestObject @synthesize func; -(void)invoke { if (func) func(); } @end
and when you need to execute the C function, create an instance, assign the function pointer, and execute the method that calls it:
TestObject *testObject = [[TestObject alloc] init]; testObject.func = func; [testObject performSelectorOnMainThread:@selector(invoke) withObject:nil waitUntilDone:YES];
Added bonus: for a much more general solution, see these two blog posts: Invoke any Method on any Thread and Performing any Selector on the Main Thread.