1

URL から情報をダウンロードしました。この URL を NSOperationQueue の NSOperation として送信しています。特定の NSOperation を削除して特定の URL のデータをダウンロードする方法を知りたいのですが、今は次のようにしています。

AppDelegate *appController = (AppDelegate *) [[UIApplication sharedApplication] delegate];

    for (NSOperation *op in appController.seriesQueue.operations) {

        if ([op isKindOfClass:[MyDowndload class]]) {

            MyDownload *urlInDownload = (MyDowndload *)op;

            if ([urlInDownload.myNew.urlName isEqualToString:[managedObject valueForKey:@"urlName"]] && [urlInDownload.myNew.language isEqualToString:[managedObject valueForKey:@"language"]]) {
                [op cancel];
            }
        }
    }

テーブルビューに情報があるので、インデックス パスの行を削除すると、このチェックに入力し、[op cancel] 行にも入力しますが、コンソール ログで、スレッドがまだダウンロード中であることを確認できます。停止して削除できますか?

4

2 に答える 2

8

Apple のガイドラインによると、操作をキャンセルしても、実行中の操作がすぐに強制的に停止されるわけではありません。すべての操作で isCancelled によって返される値を尊重することが期待されますが、コードはこのメソッドによって返される値を明示的にチェックし、必要に応じて中止する必要があります。

ジャスティンが提案した例....これは、必要に応じてメソッドの実行を中止する方法です。

- (void)main
 { \\ ...do work... 
   if (self.isCancelled)
      { \\ ...get out...  } 
 } 

AppleによるNSOperationクラスリファレンス

于 2012-04-25T10:35:20.277 に答える
0

リクエスト操作のダウンロードを停止するには、そのリクエストの実行ループを強制終了/停止する必要があります。

操作キューで特定の操作を見つけるには、上記の操作が許可されている単純なものだと思います。

さらに制御が必要な場合は、

nsoperation のサブクラスを作成し、操作ごとにタグを使用すると、一意のタグでチェックして特定の操作をすばやく見つけることができます。

カスタム KVO を操作のサブクラスに配置して、必要に応じて操作をすぐに停止します。つまり、そのスレッドの start メソッドをオーバーライドします。

ありがとう、

ナヴィーン・シャン

于 2012-04-25T10:32:33.733 に答える