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!
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? –
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 ... –
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. –