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.

而且似乎只使用委托我得到这个错误,我不知道如何解决。

提前致谢 :)

4

2 回答 2

3

我最近遇到了同样的问题。

可能有一些活动视图(例如UITextField,,UITextView)。在访问之前尝试resignFirstResponder这些视图delegate

于 2011-05-05T11:10:56.347 回答
1

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

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

除了最受控制的情况外,从辅助线程使用应用程序的委托是非常不典型的。

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

于 2011-01-28T22:59:07.203 回答