0

アプリで _WebThreadLockFromAnyThread エラーが発生します。アプリがクラッシュすることはありません (このような他のすべてのエラーでアプリがクラッシュしました)。

問題のあるコード行がどこにあるかを追跡するのに苦労しています。

このエラーは、セカンダリ スレッドで UI を更新しようとしたときに発生することがわかっています。私はKVO'ingのためにメイン以外のスレッドを1つだけ使用しています。私はすべてのメソッド呼び出しを

[self foo]

エラーは次のとおりです。

void _WebThreadLockFromAnyThread(bool), 0xb29ca60: Obtaining the web lock from a thread other than the main thread or the web thread. UIKit should not be called from a secondary thread.

エラーは、ログの実行ごとに同じ場所に表示され、次の 2 つのログ エントリの間に出力されます。

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"observeValueForKeyPath thread%@", [NSThread currentThread]);

    if ([keyPath isEqualToString:MAXY])
    {
        NSLog(@"current tabDictionary:%@", self.tabDictionary);

しかし、if stmt を使用して UI を変更することとは何の関係もないはずなので、プログラムの別の場所で起こっていると想定しています。

そのメモリアドレスを使用して、それがどのオブジェクトであるかを特定できますか? またはどのスレッドから試していますか?

4

2 に答える 2

3

tabDictionaryUIViewController のインスタンスが含まれており、NSLog への呼び出しにより、ログに記録される文字列を生成するためにビュー コントローラーのプロパティにアクセスしていると推測しています。これは、セカンダリ スレッドでの UIKit アクセスです。

が呼び出されたときobserveValueForKeyPath:、現在のスレッドに関する保証はありません。重要な場合は、メイン スレッドにいるかどうかを確認し、そうでない場合はperformSelector:onMainThread:ordispatch_asyncを使用して確認する必要があります。

于 2012-04-23T20:54:09.427 に答える
0

このエラーは、セカンダリ スレッドで UI を更新しようとしたときに発生することがわかっています。

UI の更新はスレッドセーフではありません。UI を更新する必要があるときはいつでも、メイン スレッドにコールバックして変更を加える必要があります。いくつかのオプションはGCD[[NSThread mainThread] performSelector:onThread:withObject:waitUntilDone:];メソッドのパラメーターが 0 または 1 の場合です。

于 2012-04-23T20:53:46.850 に答える