2010-11-19 4 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 ... 
    */ 
} 

これは3.2のiOS 4とiOS上ではなく、iOSの3.1.3およびそれ以前のバージョンで動作します。これらの以前のバージョンでは、関数は無限ループで呼び出され続けます。

との比較を変更する:

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

は効果がありません、彼らはまだ同じ値に比較することはありません。

私はうまくいくと思われる解決策を見つけましたが、私は他の人が最初に提案するものを見たいと思います。

答えて

89

[NSThread isMainThread](もしそうでなければ、あなたが持っているものは大丈夫です)多くのメカニズムのどれかを使ってメインスレッドにディスパッチしてください。

+0

これは、私が持っていたものよりもはるかにきれいです:if –

関連する問題