NSURLConnection und mehrere asynchrone Anfragen - ist es mit den übertragenen Daten unordentlich?

8

Ich habe ein NSArray von Links. Ich möchte sie mit einer Online-Artikel-Extraktor-API ( Clear Read ) analysieren und das Ergebnis für jeden Artikel zurückgeben ( etwas HTML) Ich werfe es in ein NSString .

Mein Problem rührt von der Tatsache her, dass mein Array, wenn es 100 URLs enthält, durch das Array läuft und jedes Element in die API aufnimmt und einige Ergebnisse in JSON zurückgibt. Dies feuert wie 100 NSURLConnection Aufrufe gleichzeitig asynchron.

Ich war nicht sicher, ob das ein Problem wäre, aber wenn ich 100 URLs gebe (echte Strings, keine sind null), haben die Daten, die zurückkommen, oft leere Werte für die JSON-Schlüssel (wenn sie nicht sollten t), oder die zurückkommenden Daten sind nil . Es gibt auch eine Reihe von Duplikaten.

Sollte ich mehrere asynchrone Verbindungen besser handhaben als jetzt? Wenn das so ist, wie?

    
user212541 24.03.2013, 03:31
quelle

2 Antworten

8

Ein paar Gedanken:

  1. Wenn Sie gleichzeitig asynchrone Anforderungen ausführen und das asynchrone NSURLConnection verwenden, sollten Sie für diesen Downloadvorgang eine eigene Klasse definieren, um sicherzustellen, dass jede Verbindung ihre eigenen Eigenschaften verfolgt. Auf diese Weise kann alles innerhalb dieser Klasse eingekapselt werden, wo die resultierenden Download-Objekte verfolgen können, was heruntergeladen wurde, was geparst wurde, usw. Wenn Sie asynchrone NSURLConnection nicht verwenden (zB verwenden Sie nur dataWithContentsOfURL ), Es ist sogar noch einfacher, obwohl Sie einige der Fortschrittsupdates, die NSURLConnection bietet, und / oder Streaming-Möglichkeiten verlieren.

  2. Für die beste Leistung sollten Sie gleichzeitige Anfragen durchführen. Abgesehen davon sollten Sie nicht mehr als vier oder fünf gleichzeitige Anfragen an einen bestimmten Server senden. Hierbei handelt es sich um eine Einschränkung, die von iOS auferlegt wird. Insbesondere bei einer langsamen Netzwerkverbindung besteht die Gefahr, dass die Verbindung zu einem Zeitlimit unterbrochen wird.

  3. Wenn Sie vorläufige Tests am Simulator durchführen, sollten Sie sicherstellen, dass Sie den "Network Link Conditioner" ausprobieren. Es ist Teil der "Hardware IO Tools für Xcode", die unter Downloads für Apple-Entwickler verfügbar sind. Es gibt Probleme (wie die oben erwähnten Timeout-Probleme, wenn Sie zu viele gleichzeitige Anforderungen an einen bestimmten Server haben), die sich nur in langsamen Verbindungen manifestieren.

  4. Nachdem Sie das gesagt haben, möchten Sie auch sicherstellen, dass Ihre Lösung auf einem Gerät mit realen Netzwerkgeschwindigkeiten getestet wird. Es ist einfach, erfolgreich massiv parallele Aufgaben erfolgreich auf dem Simulator auszuführen, die für das Gerät zu gierig sind. Wenn Sie die Anzahl gleichzeitiger Sitzungen auf fünf begrenzen, wird dieses Ressourcenproblem zwar verringert, sollte jedoch Teil Ihrer Teststrategie sein.

  5. Ich stimme JRG-Developer zu, dass Sie sich mit etablierten Frameworks wie AFNetworking befassen sollten. Stellen Sie jedoch sicher, dass maxConcurrentOperationCount für queue von AFHTTPClient festgelegt wird, wenn 100 Operationen in die Warteschlange gestellt werden.

  6. Ich weiß nicht, wie viele Daten Ihre 100 Anfragen beinhalten, aber seien Sie gewarnt, dass der App-Genehmigungsprozess Apps ablehnt, die in Mobilfunknetzen außergewöhnliche Netzwerkanforderungen stellen. Was eine übermäßige Aktivität des Mobilfunknetzwerks ausmacht, wird in den App-Überprüfungsrichtlinien nicht explizit erwähnt, obwohl Apple App Rejection von Apple vermeiden hat behauptet, dass Sie sicherstellen sollten, dass Sie in 5 Minuten nicht mehr als 4,5 MB überschreiten. Sie können Erreichbarkeit verwenden, um zu bestimmen, um welchen Netzwerktyp es sich handelt und möglicherweise warnen Sie den Benutzer, wenn er sich im Mobilfunk befindet (wenn sich die Datenmenge diesem Schwellenwert nähert).

Rob 24.03.2013, 05:22
quelle
3

Haben Sie darüber nachgedacht, ein Framework von Drittanbietern zu verwenden, z. B. AFNetworking - und gleichzeitig die Anzahl der asynchronen Aufrufe zu begrenzen? Vielleicht kann dies helfen / Ihr Problem lösen.

Sie können insbesondere eine Klasse networking manager erstellen, die AFHTTPClient (s) , die wiederum AFHTTPRequestOperations für jeden Endpunkt (Basis-URL) verwaltet, den Sie getroffen haben.

    
JRG-Developer 24.03.2013 03:41
quelle