48

My code needs to guarantee a certain operation run on the main thread, but calls may come from background threads.

To detect situations in the background I was using the following:

- (void)selectorToRunInMainThread:(id)arguments
{
    // push to main thread
        if ([NSRunLoop currentRunLoop] != [NSRunLoop mainRunLoop])
        {
            [self performSelectorOnMainThread:@selector(selectorToRunInMainThread:) withObject:arguments waitUntilDone:NO];
            return;
        }

    /*
    ... function content ...
    */
}

This works on iOS 4 and iOS 3.2 but not on iOS 3.1.3 and earlier. In these earlier versions, the function will keep getting called in an endless loop.

Changing the comparison to:

if (![[NSRunLoop currentRunLoop] isEqualTo:[NSRunLoop mainRunLoop]])

has no effect, they still never compare to the same value.

I found a solution that appears to be working, but I'd like to see what other people suggest first.

Cameron Hotchkies
  • 1,509
  • 1
  • 13
  • 20

1 Answers1

99

[NSThread isMainThread] and, if not, dispatch via any of a number of mechanisms to the main thread (what you have is fine).

bbum
  • 162,346
  • 23
  • 271
  • 359