Wie kann ich NSURLConnection dazu bringen, seine Delegate-Methoden von einem anderen Thread als dem Hauptthread aufzurufen? Ich versuche, mit dem ScheduleInRunLoop herumzualbern: forMode: scheint aber nicht zu tun, was ich will.
Ich muss eine große Datei herunterladen und es unterbricht den Haupt-Thread so oft, dass ein Rendering, das gerade passiert, anfängt, abgehackt zu werden.
%Vor%Die andere Sache, von der ich nicht viel sehe, sind "Modes". Es sind nur zwei Modi dokumentiert, also nicht viel, mit denen man wirklich testen kann.
Irgendwelche Ideen?
Danke
Es gibt mehrere Möglichkeiten:
dispatch_async
. Sie können letzteres so machen:
%Vor% Wenn Sie eine Garantie für den von Ihnen ausgeführten Thread wünschen, ersetzen Sie den Aufruf entsprechend durch dispatch_get_global_queue()
.
Wenn Sie den Download wirklich in einem neuen Thread durchführen müssen, ist es möglicherweise einfacher, detachNewThreadSelector:toTarget:withObject:
einzurichten, (%) eine NSAutoreleasePool
einzurichten und dann einen der synchronen Selektoren wie NSData
's% zu verwenden. Code%. Dies wird nicht die asynchrone dataWithContentsOfURL:
verwenden.
Da dieser Aufruf synchron ist, wird er erst zurückgegeben, wenn die Datei heruntergeladen wurde. Dadurch wird der Hauptthread blockiert, aber weil Sie in einem neuen Thread sind, wird dies nicht geschehen. Bitte beachten Sie, dass dies normalerweise nicht erwünscht ist. Gibt es im Hauptthread weiteren Code, der optimiert werden kann?
NSURLConnection führt bereits den asynchronen Download des Hauptthreads aus. Wenn ich Ihre Frage verstehe, möchten Sie, dass die Delegat-Nachrichten in einem anderen Thread als dem Haupt-Thread gesendet werden? Sie können das nicht tun, da Sie die interne Implementierung von NSURLConnection nicht ändern können. Ich kann mir zwei Möglichkeiten vorstellen, dies zu simulieren.
Erstellen Sie eine Teilmenge von NSURLConnection
(z. B. MyURLConnection
), die sich selbst als eigenen Delegaten zuweist. Beachten Sie, dass dies einen absichtlichen Haltezyklus erzeugt, seien Sie also vorsichtig. MyURLConnection
sollte eine neue delegate
definieren, die NSURLConnectionDelegate
unterstützt. Nennen wir das finalDelegate
. Wenn MyURLConnection
behandelt sie eigene Delegierten Nachrichten sind, nach vorne oder sie versenden zu finalDelegate
auf, was Faden Sie mögen.
Ähnlich wie Option 1, aber ohne die Unterklasse. Behandeln Sie die NSURLConnection
Delegatmethoden auf dem Hauptthread und Vorwärts / versenden sie zu, was Faden Sie möchten.
Der wichtigste Unterschied ist, wenn Sie eine wiederverwendbare Unterklasse mögen, die auf diese Weise verhält oder es ist eine einmalige Implementierung.
BEARBEITEN: Vorschlag hinzugefügt, wie Code im Hintergrund ausgeführt wird
Wenn Sie die Antwort im Hintergrund bearbeiten wollen, würde ich entweder Operationen oder große zentrale Dispatch verwenden. Sie müssen sich nicht mit Laufloops herumärgern und Threads erstellen. Schauen Sie sich Apples Concurrency Programming Guide .
Tags und Links ios nsurlconnection nsrunloop