2011-01-05 11 views
1

У меня есть NSOperationQueue, в котором я продолжаю добавлять объекты NSOperation, которые попадают на сервер и приносят данные. Есть ли способ сохранить полученные данные в том порядке, в котором они были уволены? Например, предположим, что объекты A, B и C добавляются в NSOperationQueue в порядке ABC. Теперь каждый из трех A, B и C будет передавать данные в соответствующие потоки. Я хочу сохранить результаты в том же порядке в массиве, чтобы содержимое массива становилось «результатом A», «результатом B» и «результатом C». Просьба предоставить решение или направление для правильного ответа на эти проблемы. Спасибо РебятаПолучать данные в том же порядке, что и NSOperationQueue

EDITED - В принципе, я хочу создать компонент автозаполнения, который приносит данные от сервера (так же, как и в Google App), и я думал, NSOperationQueue быть лучшим способом для осуществления этого. В настоящее время я устанавливаю maxConcurrentOperationCount равным 1, но я хочу установить его более 1, поскольку данные поступают с сервера очень медленно. Пожалуйста, укажите правильное решение или направление по этому вопросу. Thanks

ответ

1

Дайте каждой части данных значение при их создании. Вы можете передать индекс в классе NSOperation и когда вы получите ответ, оберните данные в классе самостоятельно и дать ему индекс)

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

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

, а затем, когда все ваши операции вернулись вы должны иметь массив объектов MyData. Просто отсортируйте их по индексу, чтобы получить их в исходном порядке :) Затем извлечение данных должно быть простым.


Я предположил, что вы не хотите, чтобы только одна операция в то время :)

+0

Спасибо за ваш ответ, но я использую одну операцию за раз. Можете ли вы предложить решение для этого с помощью concurrentOperationCount = 1? thanx – Nishit

+0

см. часть редактирования – Nishit

3

Если вы используете 1 оп в то время, то просто NSURLConnection бы сделать это с NSURLRequest и делегата. Нет необходимости создавать операционную очередь с операциями

ОБНОВЛЕНИЕ: Если вы хотите загрузить отдельный ресурс и использовать параллельные загрузки для этого - см. this question/answer.

Вместо использования разных хостов вы определяете один и тот же узел для разных NSURLRequests/NSURLConnections и добавляете дополнительный HTTP-заголовок Range, чтобы определить диапазон данных запрашиваемого файла. Впоследствии все операции были завершены, и данные были собраны, скажем, в массив, просто отсортировали объекты данных по диапазону, к которому они были запрошены, и объединили его.

+0

+1 для этого ответа. Вы можете еще больше оптимизировать, установив максимальное количество потоков больше одного, но повышение эффективности при загрузке нескольких файлов сразу же перевешивается логикой, необходимой для его реализации. + Более ранние версии iOS поддерживают не более 2 (более чем вероятно всего 1) – donkim

+0

См. Edit part.thanks – Nishit

1

Вам действительно нужны все результаты? Я полагаю, что если вы разрабатываете компонент autosuggest, вас должен интересовать только последний результат. Если это так, вы можете отправить сообщение «- (void) cancelAllOperations» в NSOperationQueue, прежде чем добавлять последнюю обработанную операцию. Таким образом, операции, находящиеся в состоянии ожидания, будут отменены, а те, которые обрабатываются, имеют возможность проверить состояние «отменить» до того, как они вернут данные.

+0

Спасибо, что ответили. Да, мне нужны все результаты, и я хочу сохранить результаты в той же последовательности, что и их соответствующие запросы были добавлены в очередь, т. Е.если я печатаю CAR, запросы сервера идут в порядке C, CA, CAR, и я хочу сохранить результаты в том же порядке в массиве, чтобы в результатах индекса 0 из C должно было быть, при индексах 1 результата CA и в индекс 2 результата CAR. благодаря – Nishit

Смежные вопросы