2010-11-19 3 views
42

Мой код должен гарантировать, что определенная операция выполняется в основном потоке, но вызовы могут возникать из фоновых потоков.Каков правильный способ определить, работает ли код в основном потоке в Objective-C? (iOS)

Для выявления ситуаций в фоновом режиме я использовал следующее:

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

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

Это работает на прошивке 4 и прошивке 3.2, но не на прошивке 3.1.3 и более ранние версий. В этих более ранних версиях функция будет продолжать вызываться в бесконечном цикле.

Изменение сравнения с:

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

не имеет никакого эффекта, они до сих пор не сравнить с тем же значением.

Я нашел решение, которое работает, но я хотел бы посмотреть, что предлагают другие люди.

ответ

89

[NSThread isMainThread] и, если нет, отправьте через какой-либо из нескольких механизмов в основную нить (что у вас в порядке).

+0

Это намного более чистый, чем то, что у меня было: if ([[NSRunLoop currentRunLoop] getCFRunLoop]! = [[NSRunLoop mainRunLoop] getCFRunLoop]) –

Смежные вопросы