2011-01-28 1 views
1

からデリゲートメソッドは、私はこのコードのビットをしました:コールスレッド

- (IBAction)registerAction:(id)sender { 
[NSThread detachNewThreadSelector:@selector(registerThread) toTarget:self withObject:nil]; 
} 

- (void)registerThread { 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

MyDelegate *delegate = (MyDelegate *)[[UIApplication sharedApplication] delegate]; 


NSInteger locationID = [delegate.api checkCoordinate:[NSString stringWithFormat:@"%f,%f", 
      location.coordinate.latitude, location.coordinate.longitude]]; 

NSNumber *status = [api registerWithUsername:usernameField.text 
      password:passwordField.text email:emailField.text andLocation:locationID]; 

[self performSelectorOnMainThread:@selector(registrationDoneWithStatus:) withObject:[NSNumber numberWithInt:1] waitUntilDone:NO]; 
    [pool release]; 
} 

それがうまく動作しますが、時々私はこのエラーを取得する:

void _WebThreadLockFromAnyThread(bool), 0x6157e30: 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. 

そして、唯一のデリゲートを使用しているようですこのエラーが発生し、解決方法がわかりません。事前に

感謝:)

答えて

1

あなたは非常に慎重にあなたのアプリケーションの同時実行アーキテクチャにより、思考とあなただけのメインスレッドで実行する必要がありますスレッドから何かを行使していないことを確実にすることによって、問題を修正。

この場合、UIKitにセカンダリスレッドのコードを実行させています。 _WebThreadLockFromAnyThreadにブレークポイントを設定する場合は、どこに正確に分かるでしょう。

非常に制御された状況を除いて、アプリケーションのデリゲートをセカンダリスレッドから使​​用するのは非常に非典型的です。

tl; drランダムセレクタに対して新しいスレッドを切り離すことで、アプリをスレッド化することはできません。

+0

「あなたはランダムセレクタに対して新しいスレッドを切り離してスレッドを作成することはできません。 – patrick

+0

'detachNewThreadSelector:...'を使ってスレッド内でランダムメソッドを実行してそのメソッドを実行することはできません。正しいことが起こることを期待してください。それはあなたがここでやったことではなく、ただの一般的なルールです。スレッディングは難しいです。 – bbum

+0

mhm、どうすれば_WebThreadLockFromAnyThreadにブレークポイントを設定できますか? – patrick

3

最近同じ問題が発生しました。

アクティブビューがある可能性があります(例:UITextFieldUITextView)。アクセスする前にresignFirstResponderこれらのビューを試してみてくださいdelegate

+0

ありがとうございました。私はナッツを運転していた。セカンダリスレッドでHTTPRequestを作成していて、そのエラーメッセージを受け取り続けました。 UITextFieldがfirstResponderだったことが判明しました。気にして、それらのUIビューのどれもスレッドでアクセスされていませんでした! – jyavenard

+0

[UIView endEditing:(BOOL)force]を使用して、最初のレスポンダーが辞任しているビューまたはサブビューを終了することもできます(強制的に強制終了) –