UIAlertView / Проблема с потоками
-
19-09-2019 - |
Вопрос
В моем приложении, когда нажимается определенная кнопка, я вызываю метод (postButtonClicked:
), который анализирует веб-сервис в отдельном потоке.Затем я показываю пользователю UIAlertView
чтобы сообщить им, был ли звонок успешным или нет.
Вот код, который я использую:
- (void)postButtonClicked:(id)sender {
[NSThread detachNewThreadSelector:@selector(postViaWebservices) toTarget:self withObject:nil];
}
- (void)postViaWebservices {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
WebServiceManager *wsm = [[WebServiceManager alloc] init];
BOOL success = [wsm callPost];
if (success) {
[self performSelectorOnMainThread:@selector(postSuccess) withObject:nil waitUntilDone:NO];
} else {
[self performSelectorOnMainThread:@selector(postFailure) withObject:nil waitUntilDone:NO];
}
[wsm release];
[pool release];
}
- (void)postSuccess {
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:nil
message:@"Success message"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
[alert release];
}
- (void)postFailure {
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:nil
message:@"Failure message"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
[alert release];
}
- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
...
}
Все это работало нормально, ПОКА я не добавил alertView:clickedButtonAtIndex:
к контроллеру представления (требуется для другого UIAlertView
Я показываю).Теперь, каждый раз, когда я звоню postButtonClicked:
, приложение выходит из строя.Однако, если я удалю alertView:clickedButtonAtIndex:
, затем позвоните postButtonClicked:
, приложение работает нормально.
Я не уверен, что мне нужно сделать, чтобы исправить это.
Решение
Независимо от того, имеет ли отношение содержимое метода делегирования просмотра предупреждений к сообщениям об успехе / сбое, это все равно может быть проблемой, поэтому показать нам содержимое этого метода может быть единственным способом получить от вас ответ.В любом случае, метод делегирования просмотра оповещений вызывается, когда вы нажимаете "ОК" в сообщениях об успехе / сбое, поскольку вы настраиваете делегирование оповещений как self
.Если вы не хотите, чтобы метод вызывался при отклонении предупреждений об успехе / сбое, не устанавливайте делегат.