AFNetworking 2.0 cancel specific task

别等时光非礼了梦想. 提交于 2019-12-20 09:37:18

问题


I am trying out afnetworking 2.0 and just trying to figure out how to cancel specific tasks. The old way would be to use something like

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

but I dont see anything like this in 2.0

I created a sub class of AFHTTPSessionManager which gives me access to the array of pending tasks and I can cancel them directly but I dont know how to identify 1 task from another so I can cancel only specific tasks. Task does have an taskidentifier but this doesnt appear to be what I need.

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

now if i wanted to cancel this request only how would I approach this?


回答1:


You can store the task in a variable so you can access it later:

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

Then simply cancel it with [task cancel].

Another way would be to save the task ID of the task and later ask the URL session for its tasks and identify the task you wish to cancel:

// save task ID
_savedTaskID = task.taskIdentifier;

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



回答2:


No need to save it, here is my implementation, use your subclass of AFURLSessionManager for cancelling specific request:

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



回答3:


you can do the following

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

Where MyClient is a child of AFHTTPClient and the function sharedClient is a static function which returns a singleton instance of MyClient



来源:https://stackoverflow.com/questions/19001450/afnetworking-2-0-cancel-specific-task

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!