2009-03-10 5 views
2

Ich möchte eine Klasse erstellen, um alle HTTP-Verbindungsarbeit für andere Klassen zu behandeln (um zu vermeiden, Codes wiederholt zu schreiben). Ich nenne es ConnectionCenter (Unterklasse von NSObject) und fügen Sie die folgenden Codes, um es:Wie wird eine HTTP-Verbindung in einer speziellen Klasse eingerichtet?

-(void)connect:(NSString *)strURL obj:(ConnectCenter *)objConnect 
{ 
    NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:strURL] 
               cachePolicy:NSURLRequestUseProtocolCachePolicy 
              timeoutInterval:60.0]; 

    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:objConnect]; 
    if (theConnection) 
    { 
     // receivedData is declared as a method instance elsewhere 
     receivedData = [[NSMutableData data] retain]; 
    } 
    else 
    { 
     // inform the user that the download could not be made 
    } 

} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    // append the new data to the receivedData 
    // receivedData is declared as a method instance elsewhere 
    [receivedData appendData:data]; 
} 

Und andere Klassen nennen es durch eine URL übergeben und ein Objekt von ConnectionCenter. Aber die Methode 'didReceiveData' im ConnectionCenter wird nicht aufgerufen. Irgendwelche Ideen über was ist das Problem damit?

+1

Warum akzeptiert connect: method ein ConnectionCenter in seinem zweiten Argument? Ist das nicht eine Methode von ConnectionCenter? Wenn ja, warum übergibst du das Objekt an sich selbst, wenn es sich einfach auf sich selbst beziehen könnte ("self")? –

+0

Ich mache diese Änderung, weil der normale Weg "Selbst" nicht funktioniert. Wenn das immer noch nicht funktioniert, wechsle ich zurück. –

+0

Danke. Ich ändere den Delegierten zurück zu "selbst" und es funktioniert. –

Antwort

2

Sie müssen nach dem Einrichten der Verbindung [theConnection setDelegate:self] anrufen, da connection:didReceiveData: eine Delegate-Methode ist.

Lesen Sie die documentation für weitere Informationen.

0

Ein paar Dinge über diesen Code ...

Erstens ist es verwirrend, das Objekt, das Sie als Delegierter tatsächlich einstellen. Der Aufruf von connection: didReceiveData: wird für den Delegaten der Verbindung aufgerufen. Dies ist das Objekt, das Sie an Ihre Verbindung übergeben haben: obj: method. Es ist seltsam, dass Sie eine Instanzmethode für ConnectionCenter haben, die eine Verbindung mit einem anderen ConnectionCenter-Objekt als Delegat starten kann. Stellen Sie sicher, dass Sie sich die Verbindung ansehen: didReceiveData: method für das richtige Objekt.

Wenn Sie keine Daten erhalten, ist es möglich, dass Ihre Verbindung entweder fehlgeschlagen ist oder einfach abgeschlossen wurde, ohne dass Daten zurückgegeben wurden. Sie sollten die Methoden connectionDidFinishLoading: und connection: didFailWithError: delegate implementieren, damit Sie wissen, ob die Verbindung mit oder ohne Rückgabe von Daten beendet wurde.

Schließlich haben Sie eine Race-Bedingung, die Sie beißen wird, wenn Sie eine gute, schnelle Verbindung bekommen. Das NSURLConnection-Objekt wird ausgeführt, sobald Sie es erstellen. Wenn Daten zu lesen sind, wird die Verbindung aufgerufen: didReceiveData: und Sie hängen sie an receivedData an. Aber wenn die Verbindung schnell genug ist, könnten Sie versuchen, Daten an ein receivedData anzuhängen, das noch nicht erstellt wurde. Es ist eine kleine Chance, aber obwohl die Init-Methode von NSURLConnection nicht blockiert, ist es unklug, Annahmen darüber zu machen, wie viel Arbeit es tut, um die Verbindung vor der Rückkehr zu erhalten. Erstellen Sie receivedData, bevor Sie die Verbindung starten, damit Sie sicher sein können, dass Sie die Daten bei der Eingabe speichern können.

+0

Danke in der Tat. Ich ändere den Delegierten zu "selbst" und es funktioniert. Vielleicht gab es letztes Mal einen Verbindungsfehler. –