2011-01-05 12 views
1

私はNSOperationQueueを持っています。NSOperationオブジェクトを追加して、サーバに到達してデータを取り込みます。受け取ったデータを、発射された順に格納する方法はありますか?たとえば、A、B、CオブジェクトがNSOperationQueueにABCの順番で追加されたとします。これで3つのA、B、Cのそれぞれが対応するスレッドにデータを持ち込みます。アレイの内容が「結果A」、「結果B」および「結果C」になるように、結果を同じ順序で配列に格納します。 この問題の解決策または正しい答えに向けて指示してください。おかげでみんなNSOperationQueueと同じ順序でデータを受け取ります。

編集 - 基本的に、私は(Googleのアプリと同じ)サーバーからデータをもたらしオートサジェストコンポーネントを設計したい、と私はNSOperationQueueはこれを実装するための最良の方法であると思いました。現在、maxConcurrentOperationCountを1に設定していますが、データがサーバーから非常にゆっくりと送信されるため、1以上に設定します。この問題に向けて正しい解決策や方向性を指摘してください。ありがとう

答えて

1

作成時に各データに値を付けます。すべての操作が戻ってきたときに、あなたが持っている必要があり、その後、あなたはあなたのNSOperationクラスにインデックスを渡すことができますし、応答を取得する際に、独自のクラスにデータをラップし、それにインデックスを与える)

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

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

をし、 MyDataオブジェクトの配列最初の順序でそれらを取得するためにインデックスで並べ替えてください:)その後、データを抽出するのは簡単です。私は一度に1個のオペアンプを使用している場合は、単純なNSURLConnectionNSURLRequestでそれを行うだろう時間:)

+0

返信いただきありがとうございますが、一度に1つの操作を使用しています。 concurrentOperationCount = 1でこれを解決する方法を教えてください。 thanx – Nishit

+0

この回答は編集部 – Nishit

3

であなただけの1操作したくないと仮定してきた


とデリゲートメソッド。操作キューを作成する必要はありません。

更新:単一のリソースをダウンロードし、これに並列ダウンロードを使用する場合は、this question/answerを参照してください。

異なるホストを使用する代わりに、異なるNSURLRequests/NSURLConnectionsに同じホストを定義し、要求されたファイルのデータ範囲を定義するために追加の "Range" httpヘッダーを追加します。その後、すべての操作が完了し、配列にデータが集められ、要求されたRangeによってデータオブジェクトをソートして連結します。

+0

+1をご覧ください。最大スレッド数を1より大きい値に設定することでさらに最適化することができますが、複数のファイルを一度にダウンロードする効率の向上は、それを実装するために必要なロジックよりも重要になります+ – donkim

+0

edit part.thanksを参照してください – Nishit

1

本当にすべての結果が必要ですか?私はあなたがオートサジェストコンポーネントを開発している場合は、最後の結果だけに興味があるはずだと思います。この場合、処理する最後の操作を追加する前に、NSOperationQueueに " - (void)cancelAllOperations"メッセージを送信することができます。このようにして、待機中の操作はキャンセルされ、処理中の操作はデータを返す前に「キャンセル」状態を確認する機会があります。

+0

返信ありがとうございます。はい、すべての結果が必要です。対応するリクエストがキューに追加されたときと同じ順序で結果を保存する、つまり私がCARをタイプすると、サーバ要求はC、CA、CARの順番になり、配列の同じ順序で結果を格納したいので、Cのインデックス0の結果がそこになければならず、インデックス1のCAとCARの2つの結果を索引します。ありがとう – Nishit

関連する問題