17

afnetworking 2.0 を試してみて、特定のタスクをキャンセルする方法を見つけようとしています。古い方法は、次のようなものを使用することです

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

しかし、2.0ではこのようなものは見られません

保留中のタスクの配列にアクセスできるサブクラスを作成し、AFHTTPSessionManagerそれらを直接キャンセルできますが、あるタスクを別のタスクから識別する方法がわからないため、特定のタスクのみをキャンセルできます。タスクには taskidentifier がありますが、これは必要なものではないようです。

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);
        }];

このリクエストのみをキャンセルしたい場合、どうすればこれにアプローチできますか?

4

3 に答える 3

34

後でアクセスできるように、タスクを変数に保存できます。

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

でキャンセルするだけ[task cancel]です。

もう 1 つの方法は、タスクのタスク ID を保存し、後で URL セッションにそのタスクを要求して、キャンセルするタスクを特定することです。

// save task ID
_savedTaskID = task.taskIdentifier;

// cancel specific task
for (NSURLSessionDataTask* task in [self dataTasks]) {
    if (task.taskIdentifier == _savedTaskID) {
        [task cancel];
    }
}
于 2013-09-25T12:00:35.920 に答える
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];
        }
    }
}
于 2013-12-11T09:49:51.420 に答える
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はMyClientのシングルトン インスタンスを返す静的関数です

于 2014-04-08T19:51:00.740 に答える