2012-01-18 6 views
0

1500を超えるリクエストを含むASINetworkQueueがあります。この数のリクエストを実行するにはしばらく時間がかかります。このキューの実行中にユーザーがビュー・コントローラーを離れると、OSはビュー・コントローラーを割り振り解除し、「割り振り解除されたインスタンスにメッセージを送信しました」というエラーを受け取ります。ビューアロケートでASINetworkQueueのすべてのリクエストを安全にキャンセルする

私はdeallocメソッドで

[self.queue cancelAllOperations]; 

を使用しようとしましたが、それはキューで待機している要求だけをキャンセルするように、現在実行していると私は同じエラーを取得してい要求ではない、と思われるています。

この状況を処理する正しい方法は何ですか?ユーザーがそれを残してもキューが終了していない間にView Controllerを割り当て解除しないようにすることは可能ですか?または、キュー内のすべての要求(実行中の要求を含む)を取り消す方法はありますか?

+0

私はあなたが要求は行き過ぎのように思えるのモバイルデバイス上でキューイングされ1500+べきではありませんあえて。 – darvids0n

答えて

1

@ darvids0nと@AlexReynoldsの提案はどちらも良いです。

現在の要求の代理人がまだ設定されているため、委任された代理人に取り消されたことを通知しようとしている可能性があります。

あなたは、最も可能性が高い代わりにnilにすべてのデリゲートを設定することで、これを避けることができます。

for (ASIHTTPRequest *req in queue.operations) 
{ 
    [req setDelegate:nil]; 
    [req cancel]; 
} 
[queue setDelegate:nil]; 
0

ネットワークキューの寿命をビューコントローラの寿命から切り離します。たとえば、アプリケーションデリゲートによって管理されるようにしてください。アプリケーションデリゲートは、アプリケーションが動作中であれば有効です。

ビューコントローラが終了すると、アプリケーションデリゲートのネットワークキュー内のすべての操作がキャンセルされます。ビューコントローラが停止している場合でも、アプリケーションデリゲートは、ネットワークキューがクリーンアップ作業を行うのに十分な時間をおいて、悩まされる必要があります。

複数のキューがあると思われる場合は、識別子またはインデックスを持つ配列またはディクショナリ内の参照を保持して、それぞれのビューコントローラとは別のものを追跡できるようにします。

関連する問題