2010-11-26 5 views
1

Ich bin in dieser Situation für das Senden von ... Ich mag 100 verschiedene Web-Anfragen flicken, aber es ist in drei verschiedenen Funktionen getrennt:Threaded Programmierung in Objective-C, Anfrage an einen Webserver

-(void)functionMain { 
    for(int i = 0; i < 100; i++) 
     [self sendRequestToServer]; 
} 

so dass die erste Funktion im Grunde Anfrage zu einem gewissen URL senden und warten, bis es fertig ...

-(void)sendRequestToServer { 
    [request sendRequest:mAddress]; 
    [request didFinishSelector:@"refreshAddress"]; 
    [request startAsynchronous]; 
} 

Diese Funktion über die tatsächliche tun der Adresse schicken.

-(void)refreshAddress { 
    NSString *result = [request getResponse]; 
    mAddress = [result getTheNextAddress]; 
    [self refreshDisplay]; 
} 

Nun wird mAddress auf die nächste Webadresse gesetzt. Also habe ich eine Menge davon, und anscheinend dauert eine Anfrage etwas Zeit (etwa 600 ms), aber wenn Sie in der Hauptschleife in functionMain bemerken, habe ich keinen Mechanismus um zu sehen, ob refreshAddress seine Arbeit erledigt hat , weil es nicht ist, dann werde ich immer nur die Anfrage mit der gleichen Adresse senden.

Ich habe versucht, eine boolesche Variable zu verwenden, um die Schleife zu schützen, aber es sieht nicht so aus, als ob es funktioniert ... Gibt es eine anmutige Möglichkeit, dies zu tun? Ich bin mir nicht sicher, wonach ich suchen sollte. Ich weiß nicht, ob NSOperation oder NSThread mir helfen wird.

EDIT: Wie ich im Kommentar erwähnt, ist dies wahrscheinlich mehr wie ich hier eine Multithreading-Situation habe (um genau zu sein könnte dies 100 Threads sein), die ich nur in einen einzigen Thread machen möchte.

EDIT: Also, was ich wirklich will, wie das ist (angenommen, die Schleife nur 3):

functionMain(i = 0) -> 
sendRequestToServer 

Dann warten wir, bis diese beendet ist, dann haben wir diese:

refreshAddress (mAddress has been set to something else now) -> 
functionMain (i = 1) -> 
sendRequestToServer 

Einmal wieder:

refreshAddress (mAddress has been set to something else now) -> 
functionMain (i = 2, finished) 

sehr sehr leid, wenn ich nicht das Problem deutlich mehr beschreiben kann ... ich wünsche, ich Englisch besser schreiben kann und kann Dinge klarer beschreiben!

+0

Ich sehe nicht, dass Sie hier Threading tun. Sie scheinen auch ein Anforderungsobjekt erneut zu verwenden, bevor Sie mit dem vorherigen fertig sind. Sie benötigen wahrscheinlich 1 Anfrage und eine maddress PER Anfrage. Es scheint auch, dass Sie beabsichtigen, das Ergebnis als eine Adresse in der nächsten zu verwenden, also wie kann Threading hier helfen? –

+0

Also in diesem Request-Objekt, das ich verwende, wird die Methode [Anfrage didFinishSelector: method] warten, bis die Anfrage beendet ist, und dann die von mir angegebene Methode aufrufen. Also, was das ist, ist wirklich ein Multithread-Programm, das ich in ein einzelnes Thread-Programm mit einer Art von Sperre machen möchte ... –

+0

aber Sie scheinen das gleiche Anfrageobjekt aufzurufen, um die nächste Anfrage von maddress zu beginnen, bevor die vorherige hat fertig und ergab die nächste maddress, und die Verwendung desselben Request-Objekts wird wahrscheinlich zu einem Misserfolg führen. –

Antwort

1

Möglicherweise folge ich Ihnen hier nicht, aber wenn Sie wollen, dass sie nacheinander passieren, sollten Sie eine synchrone Anfrage in NSURLConnection verwenden.

+ sendSynchronousRequest:returningResponse:error: 
+0

Ok, diese Art von Antworten meine Frage ... Aber ich lese irgendwo, dass in iPhones ist es eine sehr schlechte Idee, Dinge synchron zu tun, richtig? Ihre Lösung funktioniert ganz gut, aber es gibt eine angemessene Verzögerung, bevor das Telefon seine Anzeige aktualisiert hat. –

+0

@the_great_monkey - Ja, wenn Sie es aus dem Hauptthread tun, wie es die Benutzeroberfläche blockiert. Sie müssen dies immer noch von einem anderen Thread aus tun und dann die Benutzeroberfläche aktualisieren, wenn der Webdienst zurückkehrt, und dann einfach die nächste synchron aufrufen. Macht Sinn? :) – willcodejavaforfood

+0

Ah ... ok. Sollte ich NSOperation oder NSThread dafür suchen? Vielen Dank. –

Verwandte Themen