2011-12-19 8 views
0

ASIHTTPRequestリクエストのsetCompletionBlock内でperformSegueWithIdentifierメソッドを実行しようとするとエラーが発生します。setCompletionBlock(ASIHTTPRequest)のperformSegueを持つWebThreadLock

ここではいくつかのコード(特定の部分が省略された)です。

// Instantiate request object 
ASIFormDataRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://[...]"]]; 

// Set request headers 
[request addRequestHeader:@"Content-Type" value:@"application/json; charset=utf-8"]; 

// Format JSON request 
NSString *json = [...] 

// Set the post data 
[request setPostBody:[[NSMutableData alloc] initWithData:[json dataUsingEncoding:NSASCIIStringEncoding]]]; 

__weak ASIFormDataRequest *_request = request; 

// Handle success 
[request setCompletionBlock:^{ 

    // Get the response 
    NSDictionary *response = [[_request responseString] JSONValue]; 

    // Do some stuff with the response... 

    // Show the title list 
    [self performSegueWithIdentifier:@"ShowTitles" sender:self]; 

}]; 

[request startAsynchronous]; 

私は取得しています正確なエラーがある:そのエラーから

bool _WebTryThreadLock(bool), 0x7d70520: Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now... 
1 WebThreadLock 
2 -[UITextRangeImpl isEmpty] 
3 -[UITextRange(UITextSelectionAdditions) _isCaret] 
4 -[UITextSelectionView setCaretBlinks:] 
5 -[UIKeyboardImpl setCaretBlinks:] 
6 -[UIKeyboardImpl setDelegate:force:] 
7 -[UIKeyboardImpl setDelegate:] 
8 -[UIPeripheralHost(UIKitInternal) _reloadInputViewsForResponder:] 
9 -[UIResponder _finishResignFirstResponder] 
10 -[UIResponder resignFirstResponder] 
11 -[UITextField resignFirstResponder] 
12 -[UIView(UITextField) endEditing:] 
13 -[UIWindowController _prepareKeyboardForTransition:fromView:] 
14 -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] 
15 -[UIViewController presentViewController:withTransition:completion:] 
16 -[UIViewController presentViewController:animated:completion:] 
17 -[UIViewController presentModalViewController:animated:] 
18 -[UIStoryboardModalSegue perform] 
19 -[UIStoryboardSegueTemplate perform:] 
20 -[UIViewController performSegueWithIdentifier:sender:] 
21 -[BaseLoginViewController viewTitleList] 
22 __39-[BaseLoginViewController getTitleList]_block_invoke_0 
23 -[ASIHTTPRequest handleStreamComplete] 
24 -[ASIHTTPRequest handleNetworkEvent:] 
25 _signalEventSync 
26 _cfstream_shared_signalEventSync 
27 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ 
28 __CFRunLoopDoSources0 
29 __CFRunLoopRun 
30 CFRunLoopRunSpecific 
31 CFRunLoopRun 

私はそれはとは何かを持っていると仮定しているが、私はまだ新しいスレッドを使用している間に新しいView Controllerに移動しようとしているという事実です。私はまだiOSデベロッパーには新しいので、あまりよく分からない。どんな助けでも本当に感謝しています。

答えて

1

確かに、あなたはここでUI(メイン)スレッド以外のスレッドからUIを変更します。

あなたは、メインスレッド上で実行する必要があります。あなたはperformSelectorOnMainThreadを使ってそれを行うことができます。

+0

完璧!魅力のように働く、ありがとう。実際の原因は分かりますが、メインスレッドで実行していない限りUIを変更できないため、ここではまだWebスレッドで実行していました。それは正しいですか? – Sarah

+0

@Sarah正確に。これは、java AWTやAndroidなど、さまざまなフレームワークで非常に一般的な動作です。 – MByD