Вызовите метод делегата из потока - PullRequest
1 голос
/ 29 января 2011

У меня есть этот бит кода:

- (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.

И похоже, что только с использованием делегата я получаю эту ошибку, и я не знаю, как ее решить.

Заранее спасибо:)

Ответы [ 2 ]

3 голосов
/ 05 мая 2011

Недавно я столкнулся с той же проблемой.

Может быть несколько активных просмотров (например, UITextField, UITextView). Попробуйте resignFirstResponder эти представления, прежде чем получить доступ к delegate

1 голос
/ 29 января 2011

Вы решаете проблему, очень тщательно продумывая архитектуру параллелизма вашего приложения и гарантируя, что вы не выполняете ничего из потока, который должен выполняться только в основном потоке.

В этом случае вы заставляете UIKit выполнять код из вторичного потока. Если бы вы установили точку останова на _WebThreadLockFromAnyThread, вы бы точно знали, где.

Чрезвычайно нетипично использовать делегат приложения из вторичного потока в любых ситуациях, кроме самых контролируемых.

tl; dr Вы не можете создать приложение с нитью, отсоединив новую нить от случайного селектора.

...