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.
To o wiele bardziej czytelne niż to, co miałem: if ([[NSRunLoop currentRunLoop] getCFRunLoop]! = [[NSRunLoop mainRunLoop] getCFRunLoop]) –