Ich habe kürzlich das Apple SDK (für iPhone usw.) gelernt und bin auf etwas gestoßen, das ich nicht verstehen kann. In den Dokumenten für "Using NSURLConnection" vonFehler oder Verwirrung in der Apple SDK-Dokumentation zu NSURLConnection?
fand ich eine seltsame Erklärung und Beispielcode. Zuerst heißt es:
Der Download beginnt sofort nach dem Empfang der initWithRequest: delegate: Nachricht. Sie kann jederzeit abgebrochen werden, bevor der Delegat eine Verbindung erhältDidFinishLoading: oder Verbindung: didFailWithError: Nachricht, indem der Verbindung eine Abbruchnachricht gesendet wird.
Als nächstes zeigt es das folgende Stück Code:
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; if (theConnection) { // Create the NSMutableData that will hold // the received data // receivedData is declared as a method instance elsewhere receivedData=[[NSMutableData data] retain]; } else { // inform the user that the download could not be made }
So scheint es mir, dass der Download muss sofort in einem anderen Thread starten, sobald theConnection initialisiert wird. Dies ist klar, da der Code nicht blockiert ist und Nachrichten an den Delegaten, in diesem Fall an sich, zurücksendet. Doch die Zuweisung von receivedData (Autorelease-Stil) passiert nach der andere Thread wird gestartet. Ist das nicht eine unsichere Race Condition? Könnte dies nicht zu einem Absturz, Speicherleck oder Datenverlust führen, wenn eine sehr schnelle Serverantwort (z. B. über ein Loopback-Gerät) oder eine unglückliche Thread-Planung vorliegt? Wäre es nicht sinnvoller receivedData zuzuweisen, bevor die Verbindung initialisiert wird, und dann einfach im obigen else-Fall freizugeben?
Ich bin so verwirrt von diesem Stück Code, hoffe, dass jemand etwas Licht für mich darauf werfen kann. Vielen Dank für jede Info,
Rudi Cilibrasi
Das macht Sinn. Kannst du eine URL angeben, die die Behauptung unterstützt, dass alle Delegationsnachrichten durch den Hauptthread gesendet werden, bitte für meine Studie? Danke für die Hilfe und Infos. –
Interessant ist auch, dass die NSURLConnection-Delegierungsnachrichten durch die Ausführungsschleife gemarshallt werden und daher nur auftreten können, wenn die Steuerung an sie zurückgegeben wird. – rpetrich
Vielen Dank für die Hilfe Mark Bessey und Rpetrich. Das ist mir jetzt klar und ich weiß es zu schätzen. –