2010-11-19 14 views
42
Mój kod musi gwarantować określoną operację uruchomioną w głównym wątku, ale połączenia mogą pochodzić z wątków w tle.

Jaki jest właściwy sposób wykrywania, czy kod działa w głównym wątku w Objective-C? (iOS)

Aby wykryć sytuacje, w tle używałem następujący:

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

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

to działa na iOS 4 i iOS 3.2, ale nie na iOS 3.1.3 i wcześniejszych. We wcześniejszych wersjach funkcja będzie nadal wywoływana w nieskończonej pętli.

Zmiana porównania do:

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

nie ma żadnego wpływu, to jednak nigdy porównać do tej samej wartości.

Znalazłem rozwiązanie, które wydaje się działać, ale chciałbym zobaczyć, co inni sugerują jako pierwsze.

Odpowiedz

89

[NSThread isMainThread] i, jeśli nie, wysłać za pośrednictwem dowolnej z wielu mechanizmów do głównego wątku (co masz jest w porządku).

+0

To o wiele bardziej czytelne niż to, co miałem: if ([[NSRunLoop currentRunLoop] getCFRunLoop]! = [[NSRunLoop mainRunLoop] getCFRunLoop]) –

Powiązane problemy