problema UIAlertView / Threading
-
19-09-2019 - |
Domanda
Nel mio app, quando si preme un determinato tasto, che io chiamo un metodo (postButtonClicked:
) che analizza un servizio Web su un thread separato. Ho quindi visualizzare all'utente un UIAlertView
per informarli se la chiamata ha avuto successo o meno.
Ecco il codice che uso:
- (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 {
...
}
Il tutto ha funzionato benissimo fino ho aggiunto il alertView:clickedButtonAtIndex:
al controller della vista (necessario per un altro UIAlertView
I display). Ora, ogni volta che io chiamo postButtonClicked:
, l'App si blocca. Tuttavia, se tolgo alertView:clickedButtonAtIndex:
, quindi chiamare postButtonClicked:
, l'App funziona bene.
Non sono sicuro di che cosa devo fare per risolvere questo problema.
Soluzione
A prescindere dal fatto che il contenuto del metodo di visualizzazione delegato avviso è rilevante per il successo / fail messaggi, potrebbe ancora essere un problema, mostrando così ci il contenuto di tale metodo può essere l'unico modo per ottenere una risposta . In entrambi i casi, il metodo di visualizzazione delegato avviso viene chiamata quando si tocca OK sul successo / fail messaggi, perché si sta impostando il delegato avvisi come self
. Se non si desidera che il metodo da richiamare quando respinge il successo / fail avvisi, non impostare il delegato.