非同期ダウンロードを実行するNSOperation
派生クラスがあります。
ダウンロード操作はメインスレッドから開始する必要があるため、応答もメインスレッドで完了します。
ダウンロードが完了したら、内のダウンロードしたデータに対してより重い操作を実行したいと思いますNSOperation
。
ダウンロードが完了した後、既存のスレッド内でバックグラウンドスレッドで再度実行する操作を取得するにはどうすればよいNSOperation
ですか?
非同期ダウンロードを実行するNSOperation
派生クラスがあります。
ダウンロード操作はメインスレッドから開始する必要があるため、応答もメインスレッドで完了します。
ダウンロードが完了したら、内のダウンロードしたデータに対してより重い操作を実行したいと思いますNSOperation
。
ダウンロードが完了した後、既存のスレッド内でバックグラウンドスレッドで再度実行する操作を取得するにはどうすればよいNSOperation
ですか?
NSOperationでメインスレッドに移動する代わりに、NSOperationによって実行されている現在のスレッドで接続を開始します。
次に、NSPortをNSRunLoopに追加して、NSURLConnectionを存続させます。
これで、すべてのコールバックは、接続を開始したスレッドと同じスレッドで受信されます。ここで、すでにバックグラウンドにある追加の作業を引き続き実行できます。
NSOperationは単に管理されたタスクです。メインスレッドの外部でネットワーク呼び出しを行うために使用する必要があります。
NSOperations内の非同期コードを処理する際の微妙な点は、コールバックが戻る前にNSOperationが完了して終了する(そしてメモリから破棄される)ことにあります。NSOperationQueueは、コードが非同期であることを認識または認識しません。
操作に既存のrunloopを使用し、NSOperationで明示的にcompleteを設定すると、コールバックを受信してそれ自体を完了としてマークするために、操作が存続します。
非同期コールバックが(操作を完了するように設定する前に)戻ると、NSOperation内のコードは、UIを更新するためのブロックを送信することによって、メインスレッドを呼び出す必要があります。
NSOperationで何かを実行し終えた後も、NSOperationを維持することを期待しないでください。それが完了した後に生きてはならないその使い捨てのタスクオブジェクト。
既存の回答で示唆されているように、ネットワーク呼び出し自体を実行するNSOperationでの処理の多くを実行する必要があります。