17

我正在尝试 afnetworking 2.0,只是想弄清楚如何取消特定任务。旧的方法是使用类似的东西

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

但我在 2.0 中看不到这样的东西

我创建了一个子类,AFHTTPSessionManager它使我可以访问待处理任务的数组,我可以直接取消它们,但我不知道如何从另一个任务中识别一个,所以我只能取消特定的任务。任务确实有一个任务标识符,但这似乎不是我需要的。

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]

另一种方法是保存任务的任务 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];
        }
    }
}

其中MyClientAFHTTPClient的子级,函数sharedClient是一个静态函数,它返回MyClient的单例实例

于 2014-04-08T19:51:00.740 回答