Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 从线程调用委托方法_Iphone_Objective C_Ios_Nsthread_Uiapplicationdelegate - Fatal编程技术网

Iphone 从线程调用委托方法

Iphone 从线程调用委托方法,iphone,objective-c,ios,nsthread,uiapplicationdelegate,Iphone,Objective C,Ios,Nsthread,Uiapplicationdelegate,我有一段代码: - (IBAction)registerAction:(id)sender { [NSThread detachNewThreadSelector:@selector(registerThread) toTarget:self withObject:nil]; } - (void)registerThread { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; MyDelegate *deleg

我有一段代码:

- (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.
似乎只有使用委托我才能得到这个错误,我不知道如何解决


提前感谢:)

您可以通过非常仔细地考虑应用程序的并发体系结构来解决问题,并确保您没有在线程中执行任何只应在主线程上执行的操作

在这种情况下,您将导致UIKit从辅助线程执行代码。如果要在任何线程的WebThreadLockFromAnyThread上设置断点,您将知道确切的位置

在任何情况下,从辅助线程使用应用程序的委托都是极不典型的,除非是在最严格控制的情况下


tl;dr您无法通过将新线程与随机选择器分离来使应用程序线程化。

您可以通过非常仔细地考虑应用程序的并发体系结构来解决问题,并确保您没有从线程执行任何只应在主线程上执行的操作

在这种情况下,您将导致UIKit从辅助线程执行代码。如果要在任何线程的WebThreadLockFromAnyThread上设置断点,您将知道确切的位置

在任何情况下,从辅助线程使用应用程序的委托都是极不典型的,除非是在最严格控制的情况下


tl;dr您无法通过将新线程与随机选择器分离来使应用程序线程化。

我最近遇到了同样的问题


可能存在一些活动视图(例如,
UITextField
UITextView
)。在访问
委托之前,请尝试
辞职FirstResponder
这些视图

我最近遇到了同样的问题


可能存在一些活动视图(例如,
UITextField
UITextView
)。在访问
委派

之前,请尝试
辞职FirstResponder
这些视图,您的意思是:“您不能通过对随机选择器分离新线程来使应用程序线程化。”?您不能通过
detachNewThreadSelector:…
在线程中使用任何随机方法并执行该方法,并且希望发生正确的事情。不说那是你在这里做的事——只是一条一般规则。Threading is hard.mhm,如何在\u WebThreadLockFromAnyThread上设置断点?在Xcode调试器中。。。可以通过UI创建符号断点,也可以在调试器控制台中输入“b_WebThreadLockFromAnyThread”。我尝试过这样做,但没有触发,我也不知道原因:(不过我要更改代码,那些api方法使用的是nsurlconnection sendSynchronousRequest…顺便说一句,谢谢:)你的意思是:“你不能通过对随机选择器分离新线程来使应用程序线程化。“?您不能通过
detachNewThreadSelector:…
在线程中使用任何随机方法并执行该方法,并且希望发生正确的事情。”。不说那是你在这里做的事——只是一条一般规则。Threading is hard.mhm,如何在\u WebThreadLockFromAnyThread上设置断点?在Xcode调试器中。。。可以通过UI创建符号断点,也可以在调试器控制台中输入“b_WebThreadLockFromAnyThread”。我尝试过,但没有触发,我不知道原因:(不过我要更改代码,那些api方法使用的是nsurlconnection sendSynchronousRequest…顺便说一句,谢谢:)谢谢你。。。我快发疯了。正在辅助线程中创建HTTPRequest,并不断收到该错误消息。结果发现一个UITextField是第一反应者。请注意,这些UI视图都没有在线程中被访问!您还可以使用[UIView endEditing:(BOOL)force]来“使作为第一响应者的视图或任何子视图辞职(可选强制)”,谢谢您的帮助。。。我快发疯了。正在辅助线程中创建HTTPRequest,并不断收到该错误消息。结果发现一个UITextField是第一反应者。请注意,这些UI视图都没有在线程中被访问!您还可以使用[UIView endEditing:(BOOL)force]来“使作为第一响应者的视图或任何子视图辞职(可选强制)”