2016-04-27 6 views
0

Ich habe viele verschiedene Empfehlungen zur Verwendung von Sperren gelesen - aber das Verhalten meines aktuellen Codes in IOS und Android verhält sich nicht richtig.Multithreaded HTTP Request Queue System Ansatz

Was ich versuche, ist ein Queue-System mit einer HTTP-Anfrage zu erstellen. Wenn eine Anfrage fehlschlägt, sollte dies die erste Anfrage sein, die erneut versucht wird. Sowohl das Senden als auch das Hinzufügen zur Warteschlange erfolgt in derselben Methode. Daher darf kein neues Objekt in die Warteschlange aufgenommen werden, bis die vorherige Anforderung abgeschlossen ist. Wenn ein Fehler auftritt und wenn die nächste Anfrage hinzugefügt wird, würde sie zwei Anfragen senden (im selben Paket und die Warteschlange löschen).

Android:

// Java 
synchronized(locker) 
{ 
    Add object to a queue if there is a new object to be added 
    If any objects in queue - send request with AsyncTask 
} 

IOS:

// Objective-C 
@synchronized(locker) 
{ 
    Add object to a queue if there is a new object to be added 
    If any objects in queue - send request with NSURLSessionDataTask 
} 

... und scheitern, entfernen Sie nicht das Objekt aus der Warteschlange.

In diesem Fall - ich vermute, dass die Sperre freigegeben wird und ein anderer Thread könnte möglicherweise die nächste Anfrage sofort senden und zuerst kommen, da die Aufgaben in einem anderen Thread gesendet werden?

Ich habe versucht mit normalen Sperren mit einigem Erfolg auf Android und kompletter Fehler auf iOS, wo das gesamte System ausfrieren. Seither habe ich gelesen, dass ich eine Sperre auf IOS sperren muss, dass sie von demselben Thread entsperrt werden muss - würde eine dispatch_async (dispatch_get_main_queue() ... für die gesamte Methode funktionieren oder müsste ich sie erneut senden, wenn completionHandler beendet ist Kann ich sicher sein, dass der completitionHandler im selben Thread aufgerufen wird wie die Methode, die ihn erstellt?

Es ist sehr wichtig, dass jedes Paket in der richtigen Reihenfolge gesendet wird

+0

Ihre Frage macht mir nicht viel Sinn. "Sowohl das Senden als auch das Hinzufügen zur Warteschlange erfolgt in der gleichen Methode. Daher darf kein neues Objekt in die Warteschlange aufgenommen werden, bis die vorherige Anfrage beendet wurde". Wäre das nicht eine Warteschlange? Wenn Sie keine neue Anfrage hinzufügen können, bis die letzte gesendet wurde? Warum sollten Sie Ihre eigene Sperre implementieren, anstatt eine ConcurrentLinkedQueue oder ähnliches zu verwenden? Ich verstehe auch nicht, welches Problem du hast, du erklärst es nicht gut. –

Antwort

0

Keine neuen Threads von AsyncTask oder NSURLSessionDataTask. Wenn Sie die Threads zu serialisieren benötigen, dh höchstens einer von ihnen gleichzeitig ausgeführt werden kann, und der nächste muss warten, bis der erste fertig ist komplett, da ist ab kein Grund, mehrere Threads auszuführen.

Sie werden einen (1) -Thread für alle Anfragen wünschen und vielleicht Daten über eine Warteschlange senden. Andernfalls könnte die Benutzeroberfläche beim Senden von HTTP-Anforderungen einfrieren.