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デベロッパーには新しいので、あまりよく分からない。どんな助けでも本当に感謝しています。
完璧!魅力のように働く、ありがとう。実際の原因は分かりますが、メインスレッドで実行していない限りUIを変更できないため、ここではまだWebスレッドで実行していました。それは正しいですか? – Sarah
@Sarah正確に。これは、java AWTやAndroidなど、さまざまなフレームワークで非常に一般的な動作です。 – MByD