2012-02-02 13 views
1

にNSDataのinitWithContentsOfURLをキャンセルNSOperationにキャンセルメッセージが送信されると、NSOperationを継続するか、完全に停止します。 NSOperationのキャンセル操作キャンセルは、操作を停止する必要があることを通知するだけですが、操作コードを強制的に停止することはありません。は、私は現在、キーパス「isCancelled」のためのオブザーバーを持ってNSOperationに次のコードを持ってNSOperation

答えて

7

キャンセルすることはできません。

負荷を途中までキャンセルする場合は、NSURLConnectionを非同期モードで動作させてください。セットアップはもう少しですが、ダウンロードプロセスのどの時点でも取り消すことができます。

また、私は、単一のメソッド呼び出し;-)

NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
[[RequestQueue mainQueue] addRequest:request completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 

    if (data && error == nil) 
    { 
     //do something with your downloaded data 
    } 
}]; 

//to cancel the download at any time, just say 
[[RequestQueue mainQueue] cancelRequest:request]; 

簡単で非同期NSURLConnectionとそのデリゲートをラップと書いthis handy classを使用することができます!

</shamelessSelfPromotion>

上記の要求がすでに非同期であり、かつクラスは、すでに複数の要求のキューイングを管理するので、あなたはNSOperationQueueでラップ(とすべきでない)する必要はありません。

+0

これは理にかなっていますが、ダウンロードが完了したら成功ブロック内から別のXML操作を開始することを止めるものはありません。私はちょうど別のスレッドの中からスレッドを生成することは単なる資源の浪費であるため、NSOperatiomの中で要求自体を行うべきではないということを意味しました。 mainQueue共有インスタンスはスレッドセーフではないため、できるだけ必要な場合は、ログとしてNSOperationごとに新しいRequestQueueインスタンスを作成します。 –

+0

ありがとうございました!!!!あなたのコードは本当に私を助けました:私はTIFFのサイズが約500MB(正直)で、今私は間違って起動した負荷をキャンセルできます!ブリリアント。 – Todd

関連する問題