2009-04-18 15 views
9

バックグラウンドで一連のNSXMLDocumentsをUIに応答してダウンロードして解析するNSInvocationOperationがあります。NSInvocationOperationを停止する方法は?

私の呼び出し操作を停止しようとすると、NSOperationQueueのcancellAllOperationsを呼び出すことになります。しかし、これは呼び出しの実行を停止しないようです。

私はこの問題についてどのように考えますか?

答えて

3

、それがキャンセルされますことを通知されたときにそれが実際に停止、それはやっているものを、クリーンアップ、および出口にあなたのNSOperationオブジェクトの実装次第です。キュー上のすべての操作を取り消すメッセージでは、新しい操作のデキューをキューから停止し、現在実行中の操作にキャンセルメッセージを送信します。

操作のメインメソッドでは、実際にキャンセルされたときにisCancelledをチェックしてその状態を処理する必要があります。

詳細については、「スレッドプログラミングガイド」のCreating and Managing Operation Objectsを参照してください。

+0

しかし、他の答えを見ると、 'NSInvocationOperation'を使うときには(少なくとも' isCancelled'をチェックする標準的な方法で)これを行うことはできないようです。 – jrdioko

5

上記の投稿は素晴らしいですが、より直接的に元の質問に答える:NSInvocationOperationオブジェクトは、キャンセルをサポートしていないため停止できないようです。あなたはそれをサブクラス化しなければならないでしょう。

11

更新日:私がこれを行うと、インストゥルメントは十分にリークを示します。 慎重に進んでください!私は実際に何かに乗っている場合に備えて、これを保持しています。誰かが漏れの障害を乗り越える方法を見つけ出すことができます。

NSInvocationOperationさんinitWithTargetためオブジェクトとしての動作を設定します:セレクター:オブジェクトを:方法を

は、ここで私はこれを入力すると、私は再びしようとしているツイストアイデア、です。我々は独自のコールへのallocをばらばらにする必要が

NSInvocationOperation *operation = [NSInvocationOperation alloc]; 
operation = [operation initWithTarget:self selector:@selector(myOperation:) object:operation]; 
[queue addOperation:operation]; 
[operation release]; 

注:NSOperationQueueはすでにあなたをしていると仮定(我々はそれをキューを呼ぶことにします)。それ以外の場合は、オブジェクトをに設定することはできません。

操作方法の中でオブジェクトをキャストして、isCancelledのチェックを振りかけます。あなたは今のオブジェクトを渡すことになりますから、...コール:たとえば:

- (void)myOperation:(id)object { 
    NSInvocationOperation *operation = (NSInvocationOperation *)object; 
    if ([operation isCancelled]) return; 
    ... 
    } 

は、あなたのセレクタが戻っinitWithTargetでコロンで終わることを確認してください。

これまでのところ、とても良いです。今私は強制的にcancelAllOperations、私はこれが実際に動作するかどうかを知るでしょう。 :)

+0

リークのために試してみませんか?しかし、アイデアは素晴らしいです! –

8

NSInvocationOperation isCancelledがYESであるかどうかを確認する必要があります。操作を実行するとき

はNSInvocationOperation isCancelledオブザーバとして自分のオブジェクトを追加します:

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:<targetObj> selector:@selector(<targetMethod>) object:nil]; 
[operation addObserver:<targetObj> forKeyPath:@"isCancelled" options:NSKeyValueObservingOptionNew context:nil]; 
[operQueue addOperation:operation]; 
[operation release]; 

はその後targetObjはで見ることが

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context; 

を実装NSInvocationOperationで、あなたがキー値観測を使用することができることを行うには NSOperationQueueのcancellAllOperationsによってisCancelledが変更されています。 ここでプライベートフラグを設定することができ、targetMethodはそれをチェックして必要に応じてキャンセルできます。

関連する問題