1

私は、ネイティブの連絡先をサーバーにアップロードして応答を取得するアプリに取り組んでいます(JSON、既にアプリをインストールした連絡先リスト)。ネイティブの連絡先が十分に大きい場合、サーバーの応答は遅くなり、不安定になります。また、ユーザーは他のことを行うことができません。そのため、ネットワーク リクエストをバックグラウンド スレッドに入れました。100 件の連絡先をアップロードするたびに、いくつかのタスクを実行してから、ループが終了するまで次の 100 件の連絡先をアップロードします。

しかし、実行すると、結果は期待どおりではありません。バックグラウンドスレッドが実行されているため、サーバーをリクエストし続けます。UI スレッドがブロックされています。まだ何もできません。

これは、バックグラウンド スレッドでの長いループの原因ですか? 私は2つのスレッドを持っていますが、それらはCPUリソースを競合します(テストデバイスはiPod、1コアです。これはコア数に関連していない可能性があります)?

この種のシナリオを処理する方法についてのヒントを誰か教えてもらえますか? 前もって感謝します!

アップデート:

根本的な原因を見つけました。App デリゲートのグローバル変数が間違った値に設定されているため、UI の動作がおかしい。これは、すべてのネットワーク要求メソッドをコメントすることで見つけました。したがって、この問題はマルチスレッドとは関係ありません。ご迷惑をおかけして申し訳ありません。

4

1 に答える 1

0

ネットワーク操作をどのように実行しているかについて、明確にする必要があると思います。

第 1 に、NSOperatiomQueue は NSOperations を処理するため、ネットワーク コードを NSOperation サブクラスでラップしていると思われます。

第 2 に、ネットワーク コードに NSURLConnections を使用していますか?

第 3 に、ブロッキング部分は NSURLConnection ですか、それとも NSURLConnection のコールバックをデリゲートしますか?

注意すべき点の 1 つは、平凡な NSURLConnections が内部でマルチスレッド化されて実装されていることです。オブジェクトはデフォルトでメイン スレッドの実行ループに配置されますが (メイン スレッドから実行される場合)、オブジェクトは、別のスレッドで発生する低レベルのネットワーク コード (BSD ソケット) からデリゲートへのコールバックを処理する単なるラッパーです。

メイン スレッドで NSURLConnections を使用して UI をブロックすることはできません。ただし、A) デリゲート コールバック メソッドで高価なコードを使用してスレッドをブロックしている場合、または B) 同時 URL 接続が多すぎて実行ループが圧倒されている場合を除きます (ここで NSOperationQueue の setMaxConcurrentOperationsCount: が機能します)

于 2012-05-06T07:13:33.033 に答える