iOS, NSURLConnection: Callbacks auf anderem Thread delegieren?

8

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

    
gngrwzrd 22.11.2011, 02:15
quelle

4 Antworten

6

Es gibt mehrere Möglichkeiten:

  1. Verwenden Sie in Ihrer Implementierung der Delegate-Methoden dispatch_async .
  2. Starten Sie den Zeitplan für die Verbindung in einem Hintergrundthread.

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() .

    
danyowdee 26.12.2011, 15:34
quelle
2

Wenn du Downloads in einem separaten Thread durchführen willst, bin ich mir ziemlich sicher, dass dies die Droiden sind, nach denen du suchst ...

%Vor%     
Brooks 25.06.2012 16:17
quelle
0

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?

    
greg 22.11.2011 02:34
quelle
0

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.

  1. 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.

  2. Ä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 .

    
XJones 22.11.2011 04:09
quelle

Tags und Links