2011-01-05 9 views
1

Ich habe eine NSOperationQueue, in der ich NSOperation-Objekte hinzufügen, die den Server treffen und Daten bringen. Gibt es eine Möglichkeit, die empfangenen Daten in der Reihenfolge zu speichern, in der sie gefeuert wurden? Angenommen, die Objekte A, B und C werden in NSOperationQueue in der Reihenfolge ABC hinzugefügt. Jetzt bringt jede der drei A, B und C Daten in ihre entsprechenden Threads. Ich möchte die Ergebnisse in der gleichen Reihenfolge in einem Array speichern, so dass der Inhalt des Arrays "Ergebnis A", "Ergebnis B" und "Ergebnis C" wird. Bitte geben Sie eine Lösung oder eine Richtung auf die richtige Antwort für diese Probleme. Danke JungsEmpfangen von Daten in der gleichen Reihenfolge wie NSOperationQueue

EDITED - Grundsätzlich mag ich eine Autosuggest Komponente entwerfen, die Daten vom Server bringt (die gleichen wie in Google app), und ich dachte NSOperationQueue die beste Methode, um dies zu realisieren. Zurzeit setze ich den maxConcurrentOperationCount auf 1, aber ich möchte es auf mehr als 1 setzen, da Daten sehr langsam vom Server kommen. Bitte zeigen Sie die richtige Lösung oder Richtung auf diese Frage hin. Danke

Antwort

1

Geben Sie jedem Stück Daten einen Wert, wenn Sie sie erstellen. Sie können den Index in die NSOperation Klasse übergeben und wenn Sie eine Antwort erhalten, wickeln Sie die Daten in einer Klasse der eigenen und geben ihm den Index)

@class MyData : NSObject { 
    NSData *data; 
    uint index; 
} 

@property (nonatomic, assign) uint index; 
@property (nonatomic, copy) NSData *data; 

und dann, wenn alle Ihre Operationen zurückgegeben haben, sollten Sie haben ein Array von MyData-Objekten. Sortiere sie einfach nach Index, um sie in der ursprünglichen Reihenfolge zu erhalten :) Dann sollte das Extrahieren der Daten einfach sein.


Ich bin davon ausgegangen, dass Sie nicht möchten, dass nur eine Operation zu einer Zeit :)

+0

Vielen Dank für Ihre Antwort, aber ich verwende eine Operation zu einer Zeit. Können Sie hierfür eine Lösung mit concurrentOperationCount = 1 bereitstellen? danke – Nishit

+0

Bitte beachten Sie den Beitrag – Nishit

3

Wenn Sie mit 1 op zu einem Zeitpunkt, dann einfach NSURLConnection tun würde, dass mit NSURLRequest und Methoden delegieren. Keine Notwendigkeit, eine Operationswarteschlange mit Operationen zu erstellen

UPDATE: Wenn Sie einzelne Ressourcen herunterladen und parallele Downloads dafür verwenden möchten - siehe this question/answer.

Anstatt verschiedene Hosts zu verwenden, definieren Sie denselben Host für verschiedene NSURLRequests/NSURLConnections und fügen einen zusätzlichen "Range" -Head hinzu, um den Datenbereich der angeforderten Datei zu definieren. Danach waren alle Operationen abgeschlossen und die Daten wurden zum Beispiel in einem Array gesammelt. Sortieren Sie einfach die Datenobjekte nach Range, mit dem sie angefordert wurden, und verketten Sie sie.

+0

+1 für diese Antwort. Sie können weiter optimieren, indem Sie die maximale Anzahl der Threads auf größer als eins setzen, aber die Effizienzsteigerung beim gleichzeitigen Herunterladen mehrerer Dateien scheint durch die Logik zur Implementierung übertroffen zu werden. Ältere iOS-Versionen unterstützen höchstens 2 (mehr als wahrscheinlich nur 1) – donkim

+0

Bitte beachten Sie die Bearbeitung part.thanks – Nishit

1

Benötigen Sie wirklich alle Ergebnisse? Ich stelle mir vor, dass Sie, wenn Sie eine Autosuggest-Komponente entwickeln, nur am letzten Ergebnis interessiert sein sollten. Wenn dies der Fall ist, können Sie die Nachricht "- (void) cancelAllOperations" an Ihre NSOperationQueue senden, bevor Sie Ihre letzte Operation zur Verarbeitung hinzufügen. Auf diese Weise werden die Vorgänge, die sich im Wartestatus befinden, abgebrochen, und diejenigen, die gerade bearbeitet werden, haben die Möglichkeit, ihren Status "Abbrechen" zu überprüfen, bevor sie Daten zurückgeben.

+0

Danke für die Antwort. Ja, ich brauche alle Ergebnisse, und ich möchte die Ergebnisse in der gleichen Reihenfolge speichern, in der ihre entsprechenden Anforderungen zur Warteschlange hinzugefügt wurden, d.Wenn ich CAR gebe, gehen die Serveranforderungen in der Reihenfolge C, CA, CAR und ich möchte die Ergebnisse in der gleichen Reihenfolge im Array speichern, so dass bei Index 0 Ergebnisse von C dort sein müssen, bei Index 1 Ergebnisse von CA und at Index 2 Ergebnisse von CAR. Vielen Dank – Nishit

Verwandte Themen