2009-03-16 6 views
3

Ich habe eine unabhängige Klasse für die HTTP-Verbindung erstellt. Die Verbindung funktioniert einwandfrei. Das Problem ist, dass ich finde, dass die Methode "didReceiveData" NACH der Methode aufgerufen wird, die die Verbindung aufruft. (Methode ‚didReceiveData‘ wird nach IBAction aufgerufen werden ‚akzeptieren‘)Diskussion über die Methode 'didReceiveData' für die HTTP-Verbindung


- (IBAction)accept:(id)sender { 
    [self connect:url]; 
    //labelStr = ReturnStr; Cannot be written here. 
} 

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

    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 
    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 appendData:data]; 
    ReturnStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
} 

Dies wird zu einem Problem führen, dass, wenn ich den Text eines Etiketts auf die empfangene Zeichenfolge ändern möchten, kann der Code nicht in IBAction geschrieben werden " akzeptieren‘, sondern müssen in der Methode geschrieben werden‚didReceiveData‘wie folgt aus:


    MainViewController *mainView = [[MainViewController alloc] initWithNibName:@"MainView" bundle:nil]; 
    AMEAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
    [delegate.navController pushViewController:mainView animated:YES]; 
    mainView.labelStr.text = ReturnStr; 

Ein weiteres Problem besteht darin, dass die Daten auf Mainview überschrieben wird, wenn ich in Mainview initialisieren‚didReceiveData‘. Ist es mir möglich, den Text von labelStr zu ändern, ohne MainView zu initialisieren?

Antwort

1

Wenn Ihre App warten soll, bis die Daten eintreffen, verwenden Sie die sendSynchronousRequest:returningResponse:error:-Methode von NSURLConnection. Beachten Sie jedoch, dass der Rest Ihrer App eingefroren wird, während diese Methode ausgeführt wird, und die Methode kann natürlich eine Weile dauern, wenn der Benutzer eine schlechte Verbindung hat.

+0

Wie wird die Verbindung beim Laden beendet? Gibt es etwas wie didFinishLoading-Methode? –

+0

Mit sendSynchronousRequest: returningResponse: error :, wird alles von dieser Methode verwaltet. Wenn die Methode zurückkehrt, wurde die Verbindung geöffnet, die Anforderung gesendet, die Antwort empfangen und die Verbindung wieder geschlossen. Das könnte allerdings ein paar Sekunden dauern. –

2

The problem is that I find method 'didReceiveData' will be called AFTER the method who call the connection. (method 'didReceiveData' will be called after IBAction 'accept')

Sie die Verbindung erwartet Sie connection:didReceiveData: zu senden, bevor Sie es erstellen und verbinden?

This will cause a problem that if I want to change the text of a label to the received string, the code cannot be written in IBAction 'accept' but have to be written in method 'didReceiveData' …

Hört sich gut an. Sie können nicht mit etwas arbeiten, das Sie erhalten haben, bis Sie es erhalten haben.

A further problem is that the data on MainView will be overwritten if I initialize MainView in 'didReceiveData'. Is it possible for me to change the text of labelStr without initialize MainView?

Erstellen der Hauptansicht-Controller und AppDelegate in Ihrer connection:didReceiveData: Methode scheint wirklich spät, das zu tun. Tun Sie diese Dinge früher, dann haben Sie connection:didReceiveData: tun nichts als labelStr.text setzen.

BTW, die Implementierung von connection:didReceiveData:, die Sie Lecks zeigen ReturnStr. Denken Sie daran, das, was Sie haben, freizugeben oder zu veröffentlichen.

0

NSURLConnection und andere ähnliche Klassen sind für die asynchrone Verwendung konzipiert.

initWithRequest: delegate: gibt sofort zurück, und Sie sind nicht verärgert über die Verbindung Zeug, bis es die Delegate-Methoden an seinen Delegaten sendet.

0

Verwendung von NSMutableData anstelle von NSData.

+0

Hi new-soul, die receivedData wurde bereits als NSMutableData deklariert. –

Verwandte Themen