2011-01-28 273 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 2011-01-28 23:20:15

+0

您不能採用任何隨機方法,並通過`detachNewThreadSelector:`在線程中執行該方法,並且希望發生正確的事情。不是說這就是你在這裏做的 - 只是一個普遍的規則。線程很難。 – bbum 2011-01-29 00:26:41

3

我最近遇到了同樣的問題。

可能存在一些活動視圖(例如,UITextFieldUITextView)。嘗試resignFirstResponder訪問之前的那些意見delegate