2010-07-23 1 views
15

Ho visto domande simili qui, ma non sono riuscito a trovare una soluzione al mio problema. Ho una semplice NSURLConnection nel thread principale (almeno io non ho creato nessun altri thread), ma i miei metodi delegato non sono vengono chiamatiNSURLConnection non chiama i metodi delegati

[[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease]; 

e nessun metodo chiamato, per esempio

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
NSLog(@"didReceiveResponse"); 
} 

self è anche un delegato per NSXMLParser, ma penso che non dovrebbe essere un problema, come ho questo lavoro nella mia altra classe nello stesso progetto. Ho controllato tutto già 10 volte, ma non ho trovato alcun problema.

Ho visto qualche trucco per risolverlo qui: http://www.depl0y.com/?p=345 ma non mi piace, potrebbe essere qualcuno che conosce una soluzione migliore? grazie

risposta

27

L'unica ragione che so è un thread separato (che è già terminato quando vengono chiamati i metodi delegati).

Provare a NSLog(@"Is%@ main thread", ([NSThread isMainThread] ? @"" : @" NOT")); destra prima della creazione di collegamento url

+0

L'ho cambiato in 'NSLog (@" È thread principale% @ ", ([NSThread isMainThread]? @" Yes ": @" NOT "))' e get " È il thread principale Sì " – Burjua

+0

quindi, se la risposta è sì o no, ho lo stesso problema, nessuno dei metodi delegati viene chiamato – zambono

+0

@zambono, si avvia la connessione nel thread principale (o thread in background gestito manualmente) ? –

4

L'autorelease è pericoloso. Le chiamate al delegato vengono effettuate dopo il ritorno della funzione (in modo asincrono). Lo stai trattenendo da qualche altra parte?

+0

problema non è in autorelease ((feci Eugenio Depalo suggerito – Burjua

+0

La connessione può e deve essere liberato subito dopo l'assegnazione e iniziazione Questo non è il motivo –

+0

questo. è davvero un missaggio molto comune.attenzione per questo. – Magnus

1

Devi release l'oggetto NSURLConnection nella - (void)connectionDidFinishLoading:(NSURLConnection *)connection callback come sottolineato nella documentazione di Apple, non altrove:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    // Do whatever you want here 

    // Release the connection 
    [connection release]; 
} 

Non rilasciare con autorelease, come suggerito Lou Franco.

Se non è il problema, allora forse è necessario implementare tutti i metodi richiesti nella classe delegato:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

Il delegato viene trattenuto dal NSURLConnection quindi non devi preoccuparti di questo.

+0

Non l'ha suggerito)), ma in ogni caso, ho rimosso autorelease, rilasciarlo in connectionDidFinishLoading, ma non aiuta (((( – Burjua

+0

La connessione può e dovrebbe essere rilasciato subito dopo la sua allocazione e iniziazione, non è questo il motivo. –

+0

Sì, ho tutti questi 4 metodi (( – Burjua

15

provare a eseguire la vostra connessione a thread principale:

NSURLConnection * connection = [[NSURLConnection alloc] initWithRequest:request 
             delegate:self startImmediately:NO]; 

[connection scheduleInRunLoop:[NSRunLoop mainRunLoop] 
      forMode:NSDefaultRunLoopMode]; 
[connection start]; 
+0

impressionante .... mi ha aiutato anche :) – Swati

1

penso che potreste aver perso NSURLConnectionDelegate nel file di intestazione di classe.

Ad esempio:.

@interface yourClass : NSObject <NSURLConnectionDelegate>