2013-09-25 7 views
17

私はafnetworking 2.0を試していますが、特定のタスクをキャンセルする方法を理解しようとしています。 古い方法はAFNetworking 2.0特定のタスクをキャンセル

[self cancelAllHTTPOperationsWithMethod:@"POST" path:@"user/receipts"] 

のようなものを使用することですが、私は私の保留中のタスクの配列へのアクセスを提供しますAFHTTPSessionManagerのサブクラスを作成し、私ができる2.0

にこのようなものを参照してくださいいけませんそれらを直接キャンセルすることはできますが、私は特定のタスクだけを取り消すことができるので、別のタスクから1つのタスクを識別する方法はわかりません。 タスクにはタスク識別子がありますが、これは必要なものとは思われません。

NSString *path = [NSString stringWithFormat:@"user/receipts"]; 
[self.requestSerializer setAuthorizationHeaderFieldWithUsername:[prefs valueForKey:@"uuid"] password:self.store.authToken]; 
[self GET:path parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { 
      completionBlock(responseObject); 
     } failure:^(NSURLSessionDataTask *task, NSError *error) { 
      errorBlock(error); 
     }]; 

このリクエストをキャンセルするにはどうすればよいですか?

答えて

34

あなたは後でそれにアクセスできるように、変数にタスクを保存することができます

NSURLSessionDataTask* task = [self GET:path parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { 
      completionBlock(responseObject); 
     } failure:^(NSURLSessionDataTask *task, NSError *error) { 
      errorBlock(error); 
     }]; 

は、単純[task cancel]でそれをキャンセルします。

もう一つの方法は、タスクのタスクIDを保存し、後でそのタスクのためのURLセッションを尋ねると、あなたがキャンセルしたいタスクを識別するために、次のようになります。

// save task ID 
_savedTaskID = task.taskIdentifier; 

// cancel specific task 
for (NSURLSessionDataTask* task in [self dataTasks]) { 
    if (task.taskIdentifier == _savedTaskID) { 
     [task cancel]; 
    } 
} 
+1

のシングルトンインスタンスを返す静的関数で、まだ成功コールバックを呼び出していますキャンセルされると? –

+0

私はNSURLSessionDataTaskでGETメソッドを宣言することについて考えなかった。どうもありがとうございました ! – JJBoursier

7

それを保存する必要はありませんが、ここに私があります実装、特定の要求をキャンセルするAFURLSessionManagerのサブクラスを使用します。

- (void)cancelAllHTTPOperationsWithPath:(NSString *)path 
{ 
    AFURLSessionManager * yourSessionManager = [self getSessionManager]; 

    [[yourSessionManager session] getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) { 
     [self cancelTasksInArray:dataTasks withPath:path]; 
     [self cancelTasksInArray:uploadTasks withPath:path]; 
     [self cancelTasksInArray:downloadTasks withPath:path]; 
    }]; 
} 

- (void)cancelTasksInArray:(NSArray *)tasksArray withPath:(NSString *)path 
{ 
    for (NSURLSessionTask *task in tasksArray) { 
     NSRange range = [[[[task currentRequest]URL] absoluteString] rangeOfString:path]; 
     if (range.location != NSNotFound) { 
      [task cancel]; 
     } 
    } 
} 
+2

Up-votedですが、別のリクエストパスの部分文字列であるパスはどうですか? "/ item/1"と "/ item/11"をキャンセルすると、項目1をキャンセルすることもできます。11. "..." URL] path isEqualToString:path] '' ' –

+0

それを指摘してくれてありがとう...私はこのアプローチを使用して、ユーザーが同じコンテキストですべてのタスクをキャンセルしたい場合、「/学校/クラス/学生」が「/学校/ class/students/id001 "〜.. id100はループ内にブレークを入れていません。あなたの問題は "/ item/01"と "/ item/11"を使って扱うことができます。とにかく、比較は要件に従って変更することができます。 – Zaraki

+0

素晴らしいです、ありがとう! – marcelosalloum

0

NSArray *operations = [[[MyClient sharedClient] operationQueue] operations]; 
if(operations && operations.count > 0){ 
    for (NSOperation *operation in operations) { 
     if([operation isKindOfClass:[AFHTTPRequestOperation class]]){ 
      AFHTTPRequestOperation *httpOperation = (AFHTTPRequestOperation *)operation; 
      NSLog(@"%@", [[httpOperation request] URL]); 
      //--- if this is your request then cancel it --> [httpOperation cancel]; 
     } 
    } 
} 
を行うことができます

MyClientというがAFHTTPClientの子であり、機能sharedClientは、[タスクがキャンセル]なぜphix23任意のアイデア@MyClientという

+0

ダウングレードしていただきありがとうございますが、知識を共有する理由をご明記ください。 – Saeed

+2

おそらくあなたの解決策はAFN 1.xだけである 'AFHTTPClient'を使用しているからです。問題は、AFN 2.0に関するものでした。 – Koen

関連する問題