私のアプリは、サーバー、データ、およびデータ記述子からいくつかのリソースをダウンロードします。ユーザーの操作によってトリガーされるこれらのダウンロードは、同時に実行できます。たとえば、一度に最大 50 個のダウンロードを実行できます。これらすべての非同期タスクは、メモリ内にオブジェクトを作成することになります (たとえば、変更可能な辞書にキーを追加したり、配列にオブジェクトを追加したりするなど、データ構造にリーフを追加します)。私の質問は、これにより安定性の問題が発生する可能性がありますか? たとえば、複数の同時タスクが同じディクショナリにキーを追加しようとした場合、何らかのロックを設定して状況を処理する必要がありますか? 配列内のグラフィック要素を検索する for サイクルを実装した場合、実行中の他のタスクがサイクル中に配列の内容を変更する可能性はありますか? このマルチタスキングに関する参照または主要な一般的なオリエンテーション
2 に答える
ダウンロードの処理方法によって異なります。NSURLConnection を使用している場合は、個別のスレッド化/同時実行が処理され、コードは再入可能であるため、同時アクションについて心配する必要はありません。独自のスレッドを作成している場合、問題が発生する可能性があります。
編集: コードはメイン スレッド (メインの実行ループ) で実行されます。実行中の NSURLConnection があるとします。それは別のスレッドで実行されます。ただし、接続の進行中に発生するイベントを処理するデリゲート コードは、他のスレッドではなく実行ループで実行されます。これは、コードが一度に 1 つのことしか実行できないことを意味します。接続成功メソッドは、他のコードと同時に呼び出されることはありません。for ループが実行されている場合、ループが終了するまでメイン スレッドがブロックされます。一方、for ループがまだ実行されている間に接続が終了した場合、デリゲート コードはループが終了するまで実行されません。
グランド セントラル ディスパッチ (GCD) とバリア ブロックを調べることができます。バリア ブロックを使用すると、バックグラウンドで必要なことを実行し、リソースを「ロック」できます。
Apple のドキュメントと、GCDの Mike Ash のブログ投稿を確認してください。
基本的な要点は、作成した同時キューを使用して読み取りを実行し、バリア ブロックを使用してそのリソースへのすべてのアクセスを書き込み用にブロックすることです。いい物。
幸運を
ティム