2010-07-23 10 views
15

Ich sah ähnliche Fragen hier, aber ich konnte keine Lösung für mein Problem finden. Ich habe eine einfache NSURLConnection in Hauptthread (zumindest habe ich keine anderen Threads erstellen), aber meine Delegatmethoden bekommen nichtNSURLConnection ruft keine Delegate-Methoden

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

und keine Methoden aufgerufen genannt, z.B.

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

self ist auch ein Delegierter für NSXMLParser, aber ich denke, dass es kein Problem sein sollte, da ich diese Arbeit in meiner anderen Klasse in demselben Projekt. Ich habe alles schon 10 mal überprüft, finde aber kein Problem.

Ich habe einige hack gesehen, um es hier zu lösen: http://www.depl0y.com/?p=345 aber ich mag es nicht, kann jemand bessere Lösung sein? Danke

Antwort

27

Der einzige Grund, ich weiß, ist ein separater Thread (der bereits beendet ist, wenn die Delegate-Methoden aufgerufen werden).

Versuchen Sie, NSLog(@"Is%@ main thread", ([NSThread isMainThread] ? @"" : @" NOT")); direkt vor der URL-Verbindung Schaffung

+0

Ich habe es geändert in 'NSLog (@" Ist Haupt-Thread% @ ", ([NSThread isMainThread]? @" Ja ": @" NICHT "));' und bekommen " Ist Hauptthread Ja " – Burjua

+0

so sollte die Antwort ja oder nein sein, habe ich das gleiche Problem. Keine der Delegierten Methoden werden – zambono

+0

@zambono aufgerufen, initiieren Sie die Verbindung im Hauptthread (oder manuell verwalteten Hintergrundthread) ? –

4

Die Autorelease ist gefährlich. Die Aufrufe an den Delegaten werden ausgeführt, nachdem Ihre Funktion (asynchron) zurückgegeben wurde. Behalten Sie es woanders?

+0

Problem nicht in Autorelease ist ((, habe ich als Eugenio Depalo – Burjua

+0

kann die Verbindung vorgeschlagen und direkt nach der Verteilung und Einleitung freigegeben werden soll Dies ist nicht der Grund –

+0

Dies. ist in der Tat ein sehr häufiges Fehlverhalten. achten Sie darauf. – Magnus

1

Sie haben das NSURLConnection Objekt in dem - (void)connectionDidFinishLoading:(NSURLConnection *)connection Rückruf release wie in der Apple-Dokumentation wiesen darauf hin, nicht an anderer Stelle:

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

    // Release the connection 
    [connection release]; 
} 

Sie lassen ihn nicht mit autorelease, wie Lou Franco vorgeschlagen.

Wenn es nicht das Problem ist, dann vielleicht haben Sie alle notwendigen Methoden in der Delegate-Klasse zu implementieren:

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

Der Delegierte wird vonbeibehalten, damit Sie sich keine Sorgen machen müssen.

+0

Er schlug es nicht vor)), aber trotzdem, ich entfernte Autorelease, release es in VerbindungDidFinishLoading, aber es hilft nicht (( – Burjua

+0

Die Verbindung kann und sollte sein sofort nach seiner Zuteilung und Einleitung freigegeben.Dies ist nicht der Grund. –

+0

Ja, ich habe all diese 4 Methoden (( – Burjua

15

Versuchen Sie Ihre Verbindung auf Haupt-Thread ausgeführt wird:

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

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

genial .... hat mir auch geholfen :) – Swati

1

Ich glaube, Sie NSURLConnectionDelegate in Ihre Klassenheaderdatei verpasst haben.

. Zum Beispiel:

@interface yourClass : NSObject <NSURLConnectionDelegate>